我在一个大型项目中工作并遇到了一些麻烦。
基本上,我有一个名为DataSet
的课程。此DataSet
类使用名为std::unordered_map
的{{1}}作为数据结构。看起来有点像这样:
objects
在这种情况下,// DataSet.h
#include "Object.h"
#include <unordered_map>
// Assume I have set up my hash key and all relevant header things
class Object;
class DataSet{
public:
std::unordered_map<int, Object*, DataSetHashKey> objects;
int enum_type;
DataSet();
~DataSet();
DataSet *Copy(void);
int AddObject(int key, Object* obj);
// I have various functions (like delete object, size, clear) here
}
// DataSet.cpp
#include "DataSet.h"
#include "Object.h"
DataSet::DataSet(){
objects.max_load_factor(0.75);
}
DataSet::~DataSet(){
objects.clear();
}
DataSet* DataSet::Copy(void){
DataSet* copy = this;
return copy;
}
int DataSet::AddObject(int key, Object* obj){
objects[key] = obj;
return 1;
}
的密钥是特定类型(唯一)unordered_map
的枚举,Object
本身是虚拟类。不幸的是,我不允许改变Object
处理指针的方式。程序必须使用指向Object
的指针作为值。
以下是Object
类:
Object
可能使用此类的内容可能是/* Object.h */
class Object{
public:
virtual ~Object(){};
virtual int ObjectEnum()=0;
virtual Object* copy()=0;
}
,例如Parameter
。这是类定义(假设我们已经为它设置了一个头文件,我们有一个类的成员:BooleanParameter
和int enum_t
):
bool val
最后,这个用在名为/* BooleanParameter.cpp */
#include "Object.h"
BooleanParameter::BooleanParameter(int enum_type, bool value) {
enum_t = enum_type;
val = value;
}
BooleanParameter::~BooleanParameter(){
return;
}
Object* BooleanParameter::copy() {
return new BooleanParameter(this->enum_t, this->val);
}
的类中,它将使用此函数设置此布尔值:
Parameters
希望我已经提供了足够的信息来确定我现在可能会出现内存泄漏的原因。所以之前,我可以发誓我测试了这个实现,并在运行valgrind之后,清理干净(没有内存泄漏)。但是,我试图在一个不相关的文件上加速一些事情,在运行valgrind之后,我开始遇到这些错误:
void Parameters::SetParameter(bool boolean, int enum_type) {
this->DataSet::AddObject(enum_type, new BoolParam(enum_type,boolean));
}
只有这个错误发生了数百次。我回到了我之前通过的旧版本。不幸的是现在,它似乎仍然给我相同的内存泄漏错误。所以我假设我忘记了它并没有真正通过。
无论如何,我觉得这与我在==39126== 16 bytes in 1 blocks are definitely lost in loss record 30 of 277
==39126== at 0x47E1: malloc (vg_replace_malloc.c:300)
==39126== by 0x1B3A28D: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
==39126== by 0x17752D: Parameters::SetParameter(bool, int) (Parameters.cpp:245)
==39126== by 0x100000F62: main (main.cpp:16)
========================
==39126== 16 bytes in 1 blocks are definitely lost in loss record 31 of 277
==39126== at 0x47E1: malloc (vg_replace_malloc.c:300)
==39126== by 0x1B3A28D: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
==39126== by 0x17E752: BooleanParameter::copy() (BooleanParameter.cpp:53)
==39126== by 0x100000F62: main (main.cpp:16)
和new
内使用BooleanParameter::Copy(void)
的方式有关。或者因为它说创建的内存没有被破坏,它是否与我的Parameters::SetParameter
析构函数有关,它只是在std::unordered_map<...>
上调用clear?
我一直在努力寻找这个问题的原因,但我无法弄明白并且不想破坏更多的东西:(
编辑:我现在要求的至少是:
如果我坚持使用原始指针,我在哪里释放内存?在DataSet
的析构函数中?在unordered_map
类的析构函数中?或者在Parameters
本身的析构函数中?因为我正在返回一个类的很多新实例,我甚至可以调用BooleanParameter
?