以下代码报告:
*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;
}
Run Code Online (Sandbox Code Playgroud)
另一个具有较小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;
}
Run Code Online (Sandbox Code Playgroud)
您正在为不存在的对象分配值.
第二次之后
list.push_back(obj);
Run Code Online (Sandbox Code Playgroud)
ref不再引用有效对象 - 向量的底层存储的重新分配将该对象移动到不同的位置.从那时起,
使用ref是未定义的.
当你以后分配给它
ref = list.at(1);
Run Code Online (Sandbox Code Playgroud)
你正在写一些现在由内存管理器拥有的内存.
当malloc尝试分配内存时,它首先进行"健全性检查"以查看它是否可以检测到任何不允许的修改,并且在这种情况下确实如此.
| 归档时间: |
|
| 查看次数: |
1965 次 |
| 最近记录: |