以下代码报告:
*检测到glibc * ./cpptest:malloc():内存损坏:0x00007fffcc49c640 ***
但我无法找到可能导致堆损坏的任何一点,任何人都可以提供帮助吗?谢谢!
#include <iostream>
#include <vector>
struct BigStruct {
char bytes[128];
};
int main(int argc, char** argv) {
std::vector<BigStruct> list;
BigStruct obj;
list.push_back(obj);
BigStruct& ref = list.at(0);
list.push_back(obj);
ref = list.at(1);
// To trigger the allocator's error detection
malloc(100);
return 0;
}
具有较小struct的另一个代码运行没有任何问题
#include <iostream>
#include <vector>
struct BigStruct {
char bytes[64];
};
int main(int argc, char** argv) {
std::vector<BigStruct> list;
BigStruct obj;
list.push_back(obj);
BigStruct& ref = list.at(0);
list.push_back(obj);
ref = list.at(1);
// To trigger the allocator's error detection
malloc(100);
return 0;
}
答案 0 :(得分:5)
您正在为不存在的对象分配值。
第二次
之后list.push_back(obj);
ref
不再引用有效对象 - 向量的底层存储的重新分配将该对象移动到另一个地方。
从那时起,使用ref
未定义。
以后分配给它时
ref = list.at(1);
你正在写一些现在由内存管理器拥有的内存
当malloc
尝试分配内存时,它首先进行“健全性检查”以查看是否可以检测到任何不允许的修改,并且在这种情况下确实如此。