如何删除列表<T>中的动态分配的类对象?

时间:2019-07-09 00:16:37

标签: c++ list c++11

我只是在函数内部创建Coordi对象的列表,如下所示。 Coordi是我定义的类对象。

list<Coordi> LstOfCoordi;
for (int i = 0; i < 10; ++i)
{
    Coordi *tmp = new Coordi();
    LstOfCoordi.push_back(tmp);
} 

我想在程序终止之前将列表和每个对象释放到系统中。

如果必须释放列表的每个元素,如何处理?我尝试在下面的代码中使用删除它们中的每一个,但是它导致了编译错误。

for (int i = 0; i < 10; ++i)
{
    myClass tmp = LstOfMyCalss.back();
    delete &tmp;
    LstOfMyClass.pop_back();
} 

因此,我想从列表中删除是否足够。 只需看一下下面的代码,便可以分配每个元素,并且在销毁列表时不能正确释放它们。

for (int i = 0; i < 10; ++i)
{
    //myClass tmp = LstOfMyCalss.back();
    //delete &tmp;
    LstOfMyClass.pop_back();
} 

请让我知道释放所有分配的对象的最佳方法。

1 个答案:

答案 0 :(得分:2)

编辑: 使用std :: list创建对象列表的示例代码。

class MyClass {
public:
    std::list<Coordi> m_listCoordi;
}

//---creation of list of objects
for(int a = 0; a < numObjects; a++){
    m_listCoordi.push_back(Coordi());  //note: no 'new' is used.
}

//---destroying list of objects
m_listCoordi.clear();

使用std :: list创建指向对象的指针列表的示例代码。

class MyClass {
public:
    std::list<Coordi*> m_listCoordi;  //<---note: now list of pointer
}

//---creation of list of objects
for(int a = 0; a < numObjects; a++){
    m_listCoordi.push_back(new Coordi());
}

//---destroying list of objects
for(int a = 0; a < numObjects; a++){
    delete m_listCoordi[a];  //note: an item in m_listCoordi is already a pointer.
}
m_listCoordi.clear();

我为一个混乱的回答道歉。我没有太多时间来使它整洁和正式。我希望无论如何都会有帮助。


上一个答案:

如果您的列表为std::vector<YourClass*>,则元素包含指针值。您有责任根据保存在列表中的指针值分配和取消分配内存块。无论您采用哪种分配/分配方法,都取决于您。只要确保您的代码不会产生内存泄漏即可。

//---deallocate all elements before clearing the list.
for(auto& pItem : LstOfMyClass){  
    //note: since LstOfMyClass is a list of pointer values, pItem is a pointer variable.
    delete pItem;
}
//---clear the list.
LstOfMyClass.clear();

如果LstOfMyClass中的对象没有移动或列表没有增长或缩小,请更好地使用对象列表,而不是指向对象的指针列表。有了这个,您不必担心分配和取消分配。如果list变量被销毁,该列表将为您完成。