我有以下代码: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.62 0x005e2701 in abort () from /lib/libc.so.63 0x0061928b in __libc_message () from /lib/libc.so.64 0x006222dd in _int_malloc () from /lib/libc.so.65 0x00623e97 in malloc () from /lib/libc.so.66 0x045d7ab7 in operator new(unsigned int) () from /usr/lib/libstdc++.so.6然后它指向我上面提到的代码行。谁能告诉我为什么会这样吗? 最佳答案 您没有为结构分配足够的空间-您仅分配了一个指针的值(4或8个字节,具体取决于指针的大小),而实际上您应该分配36个字节左右的位置(具体来说,。因此,您正在通过向堆中写入随机值(所谓的堆溢出)来踩踏堆,这会弄乱sizeof(VRfile)用来跟踪内存的数据结构。举起手来终止程序。但是,由于这是C ++而不是C,因此您实际上应该使用malloc而不是operator new分配动态内存。您不必处理要分配的内存大小,它隐含在变量类型中。其次,没有理由总是说malloc而不只是说struct VRfile -仅在普通C代码(不是C ++)中,并且仅当没有适当的VRfile(通常是)时才需要。因此,只需编写以下代码:VRfile *vrinfo = new VRfile;当然,当您删除地图(或为此删除地图上的任何元素)时,请确保删除其中的每个值,以避免内存泄漏。例如:// This could also be implemented using a functor and std::for_eachfor(std::map<int, VRfile*>::iterator iter = maps.begin(); iter != maps.end(); ++iter) delete iter->second;maps.clear();关于c++ - glibc在插入到std::map中时检测到(内存错误),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5269277/
10-11 16:49