我似乎对矢量有一点内存泄漏问题。 我的代码如下所示:
class CPart {
public:
virtual void print() = 0;
};
//some other classes
class CDisk : public CPart {
public:
CDisk(int tp, int size);
~CDisk();
virtual void print();
void AddPartition(int size, const string & dsc);
static const int MAGNETIC = 0;
static const int SDD = 1;
private:
struct CPartition {
CPartition(int size, const string & dsc);
int div_size;
string disk;
};
int type;
int d_size;
vector<CPartition> ptts;
};
CDisk::CDisk(int tp, int size) {
type = tp;
d_size = size;
}
CDisk::CPartition::CPartition(int size, const string& dsc) {
div_size = size;
disk = dsc;
}
void CDisk::AddPartition(int size, const string& dsc) {
ptts.push_back(CPartition(size, dsc));
}
int main(int argc, char** argv) {
CDisk disk(CDisk::SDD, 5000);
disk.AddPartition(500, "disk1");
CPart *disk2 = new CDisk(disk);
delete disk2;
return 0;
}
当我使用valgrind运行此代码时,它表示存在内存泄漏,丢失的字节数等于向量ptts中的项目数* CPartition的大小。所以我猜我必须以某种方式清理那个矢量。我试过了,但无济于事。
答案 0 :(得分:2)
您需要在CPart中使用virutal destructor
class CPart {
public:
virtual void print() = 0;
virtual ~CPart(){};
};
否则您将获得以下方案;
int main(int argc, char** argv) {
CDisk disk(CDisk::SDD, 5000);
disk.AddPartition(500, "disk1");
CPart *disk2 = new CDisk(disk);//CDisk created
delete disk2;//But here only CPart is deleted leaving CDisks data in memory
return 0;
}
答案 1 :(得分:0)
您可以使用valgrind通过使用额外的泄漏检查参数来非常精确地隔离内存泄漏的来源,即:
valgrind --leak-check=full ./a.out
只要使用调试符号编译代码,valgrind就会告诉您泄漏的确切位置。
答案 2 :(得分:0)
我不认为这部分是真的;
struct CPartition {
CPartition(int size, const string & dsc);
int div_size;
string disk;
};
CDisk::CPartition::CPartition(int size, const string& dsc) {
div_size = size;
disk = dsc;
}
最好将struct CPartition
放在你的类定义之外并摆脱CDisk::CPartition::CPartition(int size, const string& dsc)
,即:
struct CPartition {
int div_size;
string disk;
};
要调用div_size
实例的CPartition
,您应该
instance_of_CPartition->div_size
如需进一步了解,请阅读structure tutorial。
我不确定这是否会解决您的问题,但这将解决代码中的另一个问题。