我有一个声明:
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/