奇怪的堆内存腐败与矢量

时间:2015-07-01 14:09:19

标签: c++ gcc

以下代码报告:

  

*检测到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;
}

1 个答案:

答案 0 :(得分:5)

您正在为不存在的对象分配值。

第二次

之后
list.push_back(obj);

ref不再引用有效对象 - 向量的底层存储的重新分配将该对象移动到另一个地方。
 从那时起,使用ref未定义。

以后分配给它时

ref = list.at(1);

你正在写一些现在由内存管理器拥有的内存 当malloc尝试分配内存时,它首先进行“健全性检查”以查看是否可以检测到任何不允许的修改,并且在这种情况下确实如此。