gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:07:43 25 4
gpt4 key购买 nike

我有以下代码:

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

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

最佳答案

你没有为你的结构分配足够的空间——你只分配了一个指针的值(4 或 8 个字节,取决于你的指针大小),而实际上你应该分配大约 36 个字节的地方(具体来说,sizeof(VRfile)。因此,您通过向堆中写入随机值(所谓的堆溢出)来践踏堆,这会扰乱malloc 用于跟踪内存的数据结构。当它检测到这种损坏时,它会举起手来终止您的程序。

但是,因为这是 C++ 而不是 C,所以您真的应该使用 operator new 而不是 malloc 来分配动态内存。您不必处理要分配的内存大小,它隐含在变量类型中。其次,没有理由总是说 struct VRfile 而不是 VRfile——只有在纯 C 代码(而不是 C++)中才需要,而且只有在没有合适的typedef(通常有)。

所以,就这样写:

VRfile *vrinfo = new VRfile;

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

// This could also be implemented using a functor and std::for_each
for(std::map<int, VRfile*>::iterator iter = maps.begin(); iter != maps.end(); ++iter)
delete iter->second;
maps.clear();

关于c++ - 插入 std::map 时检测到 glibc(内存错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5269277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com