4

我有一个声明:

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

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

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

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

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

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

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

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

我不明白问题出在哪里。我一直认为在向量或映射上调用删除会自动调用每个元素对应的析构函数,在这种情况下,析构函数无关。

有什么帮助吗?

编辑:添加了 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规则这是正确的。

4

1 回答 1

2

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

于 2012-11-30T12:58:19.067 回答