stl map 崩溃crash

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

}
...全文
609 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
恩,thx
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复 1
[Quote=引用 11 楼 blue__ocean 的回复:]

map什么时候会被初始化?
[/Quote]
map_mem_leak_record是个全局变量,它会在main函数之前初始化。如果有另外一个全局变量,比如MEM_RECORD_HEADER* global_header,那么它也会在main函数之前被初始化。至于这两个全局变量初始化的顺序,那就不知道了,这是undefined behavior。

LZ看看工程中的代码,是否有一个全局变量,用NEW进行了初始化。如果是的话,那么有可能map_mem_leak在当时并未初始化。

解决这样的问题,基本上就是用singleton。
xy_zhang 2010-08-09
  • 打赏
  • 举报
回复
这态度……如果什么都是对的,那结果为啥不对?大家在帮你分析呢
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
代码不是很清楚了吗,我晕啊.
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
不要质疑我的new定义对不,那是肯定对的.
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
map什么时候会被初始化?
太乙 2010-08-09
  • 打赏
  • 举报
回复
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?
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 blue__ocean 的回复:]

NEW第一次的时候就挂了
[/Quote]
第一次的那个NEW在哪儿?main函数里?
xy_zhang 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jim_king_2000 的回复:]

关键在于工程中的NEW在何时执行。我相信如果在main函数中运行NEW的话,程序应该正常。但就怕LZ用NEW去初始化全局变量。因为全局变量有一个臭名昭著的undefined behavior。那就是,在不同的translation unit中,全局变量初始化的顺序是不固定的。我现在怀疑LZ在另一个cpp中用NEW去初始化了全局变量,而正好不巧的是,这个时候map并没有初始化。
[/Quote]

这样就麻烦了
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
NEW第一次的时候就挂了
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
我的std::map<size_t, MEM_LEAK_INFO> map_mem_leak_record;

这个就是全局变量.
hai040 2010-08-09
  • 打赏
  • 举报
回复
工程里new了多次?
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
关键在于工程中的NEW在何时执行。我相信如果在main函数中运行NEW的话,程序应该正常。但就怕LZ用NEW去初始化全局变量。因为全局变量有一个臭名昭著的undefined behavior。那就是,在不同的translation unit中,全局变量初始化的顺序是不固定的。我现在怀疑LZ在另一个cpp中用NEW去初始化了全局变量,而正好不巧的是,这个时候map并没有初始化。
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
恩,上面是我写的测试代码,工程里面有用NEW,就是在NEW的时候,map调用find的时候,挂了.说root为0.
Jim_King_2000 2010-08-09
  • 打赏
  • 举报
回复
请问LZ:
1、是不是上面的代码运行正常?
2、在工程中,是否用NEW为全局变量做初始化?即是否有以下代码:
MEM_RECORD_HEADER* global_header = NEW(MEM_RECORD_HEADER);
BLUE__OCEAN 2010-08-09
  • 打赏
  • 举报
回复
补充一下,挂的时候trace现场说xtree.cpp中,root为0.因为没有很多时间去看map的内部实现,所以请教下大家.

24,860

社区成员

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

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