c – Valgrind在空的析构函数中给出“无效写入大小为8”

我宣布了一个:

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

到某个A类.这个地图是在A的构造函数中创建的:

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

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

另一方面,进入A的析构函数我正在删除地图:

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

Valgrind在删除行上告诉我“地址0x4c389b0是一个大小为48的块中的16个字节[PID:6077]”.

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

我不明白问题是什么.我一直以为在向量或映射上调用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规则是正确的.

最佳答案 问题是三违规.您的对象的任何副本都将导致双重免费.

点赞