glibc在插入std :: map时检测到(内存错误)

时间:2011-03-11 05:24:19

标签: c++ memory structuremap glibc

我有以下代码:

struct VRfile{    
    char sessionID[10];    
    char file[20];    
    int first;    
};    

std::map (int ,struct VRfile *) maps;
struct VRfile *vrinfo = (struct VRfile*)malloc (sizeof(struct VRfile*));
 strcpy(vrinfo->sessionID, sessionId.c_str());  
  strcpy(vrinfo->file, filename.c_str());  

 socketmap.insert(std::pair(int , struct VRfile *) (thisfd,vrinfo));

我在socketmap.insert(std::pair(int , struct VRfile *) (thisfd,vrinfo));行收到错误:

Error: *** glibc detected *** memory corruption: 0x080aa7b0 ***  
/lib/libc.so.6[0x6222dd]  
/lib/libc.so.6(__libc_malloc+0x67)[0x623e97]  
/usr/lib/libstdc++.so.6(_Znwj+0x27)[0x45d7ab7]  

backtrace:  
0  0x002eb402 in __kernel_vsyscall ()  
1  0x005e0df0 in raise () from /lib/libc.so.6  
2  0x005e2701 in abort () from /lib/libc.so.6  
3  0x0061928b in __libc_message () from /lib/libc.so.6  
4  0x006222dd in _int_malloc () from /lib/libc.so.6  
5  0x00623e97 in malloc () from /lib/libc.so.6  
6  0x045d7ab7 in operator new(unsigned int) () from /usr/lib/libstdc++.so.6  

然后它指向我上面提到的代码行。你能不能告诉我为什么会这样?

2 个答案:

答案 0 :(得分:2)

你没有为你的结构分配足够的空间 - 你只需要分配一个指针值(4或8个字节,具体取决于你的指针大小),实际上你应该分配36字节的某个位置(具体来说,sizeof(VRfile)。所以,你通过在其中写入随机值(所谓的堆溢出)来踩踏堆,这会弄乱{{跟踪内存。当它检测到这种损坏时,它会举手并终止你的程序。

但是,由于这是C ++而不是C,因此您应该使用malloc而不是operator new来分配动态内存。您不必处理正在分配的内存大小,它隐含在变量类型中。其次,没有理由总是说malloc而不仅仅是struct VRfile - 只有普通的C代码(不是C ++)才需要,并且只有在没有合适的VRfile时才需要{通常有)。

所以,请写下:

typedef

当然,当您删除地图(或删除地图中的任何元素)时,请务必删除其中的每个值以避免泄漏内存。例如:

VRfile *vrinfo = new VRfile;

答案 1 :(得分:1)

malloc调用中,您为指针分配了足够的内存到VRfile而不是VRfile(可能只是一个错字)。

VRfile *vrinfo = (VRfile*)malloc(sizeof(VRfile));

另请注意,在C ++中,引用类型时不需要使用struct