C++ C+中的内存泄漏+;班

C++ C+中的内存泄漏+;班,c++,memory-leaks,C++,Memory Leaks,我定义了两个类CA和CB。 我想防止内存泄漏,但我不知道如何正确地销毁类CB(假设内存泄漏来自它)。 mpz_t是一种GMP数据类型。 这是我的密码 class CA { public: void SetFoo (unsigned long int); CA (); CA (unsigned long int); ~CA (); private: mpz_t foo; }; 在哪里 及 CB类{ 公众: CB(); ~CB(); 私人: 列出我的清单; }; 在哪里 CB::CB(){

我定义了两个类CA和CB。 我想防止内存泄漏,但我不知道如何正确地销毁类CB(假设内存泄漏来自它)。 mpz_t是一种GMP数据类型。 这是我的密码

class CA {
public:
void SetFoo (unsigned long int);
CA  ();
CA  (unsigned long int);
~CA ();
private:
mpz_t foo;
};
在哪里

CB类{
公众:
CB();
~CB();
私人:
列出我的清单;
};
在哪里

CB::CB(){
配对我的配对;
CA*C=新的CA[2];
C[0].SetFoo(100);
C[1].SetFoo(200);
mypair.first=0;
mypair.second=&C[0];
mylist.push_前端(mypair);
mypair.first=1;
mypair.second=&C[1];
mylist.push_前端(mypair);
}
CB::~CB(){
???
}

您可以使用
std::unique\u ptr
代替常规指针。这将在销毁每个元素时自动释放内存

typedef std::unique_ptr<Ca[]> CA_array;
list <pair <uint16_t, CA_array> > mylist;

答案不是这样,请不要忘记修复冲突。因为您新建了一个数组,所以还必须删除该数组。你得留个参考资料。或者你可以只创建两个单独的对象并删除它们。你永远不会删除你的
new[]
。可以这样做,也可以简单地使用智能指针,或者在不需要时停止堆分配对象。手动
new
/
delete
在99%的情况下都是一个坏主意。为什么您需要
C
来指向2的数组?除了智能指针之外,您还需要了解并实现(至少)复制构造函数和赋值运算符;否则,除了泄漏之外,您将在某个时候处理没有明显原因的崩溃。
class CB {
public:
CB  ();
~CB ();
private:
list <pair<uint16_t, CA*>> mylist;
};
CB::CB () {
pair<uint16_t, CA*> mypair;
CA* C = new CA [2];
C [0].SetFoo (100);
C [1].SetFoo (200);
mypair.first  = 0;
mypair.second = &C[0];
mylist.push_front (mypair);
mypair.first  = 1;
mypair.second = &C[1];
mylist.push_front (mypair);
}

CB::~CB () {
???
}
typedef std::unique_ptr<Ca[]> CA_array;
list <pair <uint16_t, CA_array> > mylist;
CB::~CB () {
    for (auto &item : mylist) 
        delete [] item.second;
}