我声明了一个:
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规则,我认为这是正确的。
答案 0 :(得分:2)
问题是三违规。您的对象的任何副本都将导致双重免费。