gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:48 34 4
gpt4 key购买 nike

我有一个声明:

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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com