我有以下代码:
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
然后它指向我上面提到的代码行。你能不能告诉我为什么会这样?
答案 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
。