c – Valgrind在空的析构函数中给出“无效写入大小为8”
发布时间:2020-12-16 07:33:52 所属栏目:百科 来源:网络整理
导读:我宣布了一个: std::mapunsigned int,MyClass *myMap; 到某个A类.这个地图是在A的构造函数中创建的: myMap = new std::mapunsigned int,MyClass; MyClass类基本上是一个用一些getter / setter存储一些数据的结构. MyClass中没有任何指针或新实例,只有一对
我宣布了一个:
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规则是正确的. 解决方法
问题是三违规.您的对象的任何副本都将导致双重免费.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |