c++ - Valgrind 在空析构函数上给出 "Invalid write of size 8"

标签 c++ valgrind

我有一个声明:

std::map<unsigned int, MyClass> *myMap;

进入某个类A。这个映射是在A的构造函数中创建的:

myMap = new std::map<unsigned int, MyClass>;

MyClass 类基本上是一个结构,用于存储一些带有一些 getter/setter 的数据。 MyClass 中没有任何指针或新实例,只有一对枚举值、一个无符号整数和一个 bool 值。所以 MyClass 析构函数是空的。

另一方面,在 A 的析构函数中我正在删除映射:

A::~A(){
    if(myMap!=NULL){
        delete myMap;
        myMap = NULL;
    }
}

这里 Valgrind 在删除行上告诉我 “地址 0x4c389b0 是一个大小为 48 的 block 内的 16 个字节 free'd[PID:6077]”

此外,在 MyClass 析构函数中,即使是空的,我也会“大小为 8[PID:6077] 的无效写入”

我不明白问题是什么。我一直认为在 vector 或 map 上调用 delete 会自动调用每个元素对应的析构函数,在这种情况下,析构函数无关。

有什么帮助吗?

编辑:添加了 A 的构造函数:

A::A(unsigned int someValue){
    m_someValue = someValue;
    initializeMap();
}

void A::initializeMap(){
myMap = new std::map<unsigned int, MyClass>;
    for(unsigned int i=1; i<=20; i++)
        mymap->insert(std::make_pair(i,
                MyClass(i)));
}

此外,MyClass 构造函数:

SvAvailabitlity::SvAvailabitlity(unsigned int index){
    m_index = index; //unsigned int
    m_Flag = false; //bool
        m_enumData1 = NOT_OK; //enum MyEnum
    m_enumData2 = NOT_OK; //enum MyEnum
}

MyEnum 定义为:

typedef enum {
    OK = 0,
    NOT_OK = 1,
} MyEnum;

顺便说一句,我不明白反对票。有人也可以解释一下,以防万一我冒犯了这个问题,我认为根据 stackoverflow 规则这是正确的。

最佳答案

问题是违反三项规则。您的对象的任何拷贝都会导致双重释放。

关于c++ - Valgrind 在空析构函数上给出 "Invalid write of size 8",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13643373/

相关文章:

c - Valgrind memcheck 在商业库中发现大量条件跳转和无效读取

c++ - 使用 valgrind 时在本地主机上运行的偶尔 boost::asio tcp 服务器故障

c++ - Valgrind 在使用 API 时报告内存泄漏

c++ - 在没有 Anaconda 的 Qt 版本的 Qt C++ 应用程序中包含 Anaconda python 3.6

c++ - OpenCV:了解内核

c - 8 Valgrind 的无效写入大小

c - valgrind - 地址 ---- 在分配大小为 8 的 block 之后为 0 字节

c - 即使使用正确,Pthreads 也会泄漏内存

c++ - 何时链接,何时包含?

c++ - 多平台窗口界面