STL map 崩溃crash.

BLUE__OCEAN 2010-08-09 02:13:39
我用了stl map,map<int, struct>这个结构,
我自己写了个小程序测试没有问题,就是对这个map进行插入,查找,删除.
但是用在我们的工程里面,就崩溃了.完全一样的代码,也是一样的库支持.
map<int, struct MyDef> mem_info;

map<int, struct MyDef>::iterator it = mem_info.find(value); //1

if(it != mem_info.end())
{
dosomething();
}
else
{
mem_info[value] = ***; //2
}

每次一运行到1,必挂.跟进去看了下说的是红黑树的root节点为0x0000.
也就是可能没有初始化.
大家给点建议,这种情况怎么改?
...全文
610 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
当然是find size_t类型的一个key值啊
太乙 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 blue__ocean 的回复:]
#include <windows.h>
#include <iostream>
#include <string>
#include <map>
#include <stdarg.h>
using namespace std;

typedef struct _MEM_LEAK_INFO
{
char * file_name;
size_t line;
size_t all……
[/Quote]
NEW的宏定义对么??

size_t temp = (size_t)ptr;
std::map<size_t, MEM_LEAK_INFO>::iterator it = map_mem_leak_record.find(temp); //这个地方挂了,工程里面

你这find的是啥??key?value?size_t?MEM_LEAK_INFO?
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
#include <windows.h>
#include <iostream>
#include <string>
#include <map>
#include <stdarg.h>
using namespace std;

typedef struct _MEM_LEAK_INFO
{
char * file_name;
size_t line;
size_t alloc_size;
size_t alloc_times;
}MEM_LEAK_INFO;

typedef struct _MEM_RECORD_HEADER
{
size_t alloc_size;
char* file_name;
size_t line;
}MEM_RECORD_HEADER;

std::map<size_t, MEM_LEAK_INFO> map_mem_leak_record;

void* operator new(size_t size, char* file_name, size_t line);

#define NEW new(__FILE__, __LINE__)




void* operator new(size_t size, char* file_name, size_t line)
{
MEM_RECORD_HEADER header;
header.alloc_size = size;
header.file_name = file_name;
header.line = line;

MEM_RECORD_HEADER *ptr = (MEM_RECORD_HEADER*)malloc(size+sizeof(MEM_RECORD_HEADER));

ptr->alloc_size = size;
ptr->file_name = file_name;
ptr->line = line;
size_t temp = (size_t)ptr;
if (ptr)
{

std::map<size_t, MEM_LEAK_INFO>::iterator it = map_mem_leak_record.find(temp); //这个地方挂了,工程里面

if( it != map_mem_leak_record.end() )
{
it->second.alloc_size += size;
it->second.alloc_times += 1;
}
else
{
MEM_LEAK_INFO mem_info;
mem_info.file_name = file_name;
mem_info.line = line;
mem_info.alloc_size = size;
mem_info.alloc_times = 1;
//map_mem_leak_record[temp] = mem_info;
map_mem_leak_record.insert(pair<size_t,MEM_LEAK_INFO>(temp, mem_info));
}
return ptr+1;
}
else
{
return NULL;
}
}


int _tmain(int argc, _TCHAR* argv[])
{

MEM_RECORD_HEADER* p = NEW(MEM_RECORD_HEADER);

}

这个是我测试代码的一部分.工程里面也有NEW的操作,就是在NEW的时候,map挂了.
cattycat 2010-08-09
  • 打赏
  • 举报
回复
红黑树的内存是自动扩展的。这里map操作没有问题,看是不是其他地方对map的插入和删除的地方,某些地方是不是有内存越界,破坏了堆上的信息。
还有检查一下是否给map中insert了数据。
ayw215 2010-08-09
  • 打赏
  • 举报
回复
你的容器里面没push值进去么
太乙 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 blue__ocean 的回复:]
问题本身在于红黑树的root为0x000000,说明就没有自动生成节点啊.
希望对stl map内部实现熟悉的人帮忙解答下.
[/Quote]这种情况没见过!

如果lz用的不是自己实现的map,那么我可以肯定的说,应该不是stl map本身的问题!(当然不排除lz用的版本很古老)

看看别的地方有什么不妥的,主要看对map都进行了哪些操作~~~在find前打出来map的size看看多少~~!
rommi 2010-08-09
  • 打赏
  • 举报
回复
你不把你初始化 map的 代码贴出来
谁知道你错在哪里
rommi 2010-08-09
  • 打赏
  • 举报
回复
mem_info.find(key);
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
问题本身在于红黑树的root为0x000000,说明就没有自动生成节点啊.
希望对stl map内部实现熟悉的人帮忙解答下.
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
真晕啊,这些人怎么在key和value纠缠不清啊.
我的key是int,value是struct,不是都写的很清楚了吗,
map<int, struct Mydef>
真是的,不知道如何说是好啊.
xy_zhang 2010-08-09
  • 打赏
  • 举报
回复
你也说单独跑没有问题,那就要看除了这部分以外的其他代码是不是连累到它了。
肥多罗 2010-08-09
  • 打赏
  • 举报
回复
map <int, struct MyDef> mem_info;

map <int, struct MyDef> ::iterator it = mem_info.find(value); //1

mem_info在哪定义的?不可能就像你上面那样吧?key是int型,value是int型不
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
LZ看看你的map的构造是否已经调用。如果构造调用过,那么就有可能是buffer overrun。
pengzhixi 2010-08-09
  • 打赏
  • 举报
回复
不是这里的问题
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
这个value就是我自己定义的key值,是我表达上有问题
ayw215 2010-08-09
  • 打赏
  • 举报
回复
mem_info.find(value);
==
iterator find(key_type key);

map 里面find的是key。。。不是value
ayw215 2010-08-09
  • 打赏
  • 举报
回复
find会崩溃?
不应该。。。。

另外,往容器里面push struct不是个好习惯。。。最好push struct的的指针

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧