如何删除STL指针列表

How to delete a STL list of pointers?

本文关键字:STL 指针 列表 删除 何删除      更新时间:2023-10-16

我有一个配对列表。迭代列表并删除第一个和第二个元素是个好主意吗?其中的对象被分配了new。

list<pair<string,GraphObject*>>* table;
for(i=0; i< length; i++){
    it = table[i].begin();
    while(it != table[i].end()){
        delete (*it).second;
        delete &(*it).first;
    }
}

编辑:字符串没有分配给new,我现在知道我不必删除它了。这样删除第二个可以吗?

看起来您的实际需求是带有智能指针的std::map

std::map<std::string, std::shared_ptr<GraphObject>> table;

要清除表格,您只需写:

table.clear();

如果您必须使用std::list,仍然使用智能指针,您仍然只需要调用table.clear();来清除整个表。

std::list<std::pair<std::string, std::shared_ptr<GraphObject>>> table;

string不是与new一起分配的,它是pair的数据成员。您的第二个delete是一个错误。

也许它是分配了newstring对象的副本,但如果是这样,那么您可能早就泄露了原始对象。

对于第一次删除,最好删除用new分配的对象,前提是不再需要它们。你没有说你是否仍然需要这些对象(即你是否还有其他指向它们的指针(。然而,使用智能指针来帮助管理内存是一个更好的主意。

不能删除对的第一部分,因为它不是指针;您的代码甚至不应该编译。可以做的是在完成后删除整个表。

list<pair<string,GraphObject*>>* table;
for(i=0; i< length; i++){
    it = table[i].begin();
    while(it != table[i].end()){
        delete (*it).second;
    }
}
delete table;

至于是否应该删除该对的GraphObject*第二个成员,这将取决于是否有其他指针副本将在其他地方删除。可能没有,所以您的原始代码是正确的。正如在另一个答案中所指出的,使用智能指针会更容易,因此您不必担心它。