【问题标题】:How to delete a STL list of pointers?如何删除 STL 指针列表?
【发布时间】:2013-01-08 23:17:17
【问题描述】:

我有一个配对列表。 遍历列表并删除第一个和第二个元素是个好主意吗? 其中的对象是用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;
    }
}

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

【问题讨论】:

  • 每对中的string对象如何分配new?它不是指针类型...
  • 谢谢安迪,你完全正确。问题已编辑。
  • 首先,做delete &amp;(*it).first;是很糟糕的。您正在尝试使用自动存储(即在堆栈上分配)释放对象,就好像它是在堆上分配的一样。其次,您删除了这些对象,但我没有看到您从列表中删除了相应的条目,这将使您在列表本身中留下悬空指针。第三,您不应该使用裸(原始)指针,而应使用诸如shared_ptr 之类的智能指针来处理对象的生命周期。 newdelete 几乎从不需要,而且几乎总是不鼓励。

标签: c++ list memory-leaks stl iterator


【解决方案1】:

看起来你的实际需要是带有智能指针的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;

【讨论】:

  • @JohnSmith:你必须暗杀谁才能使用合理的数据结构而不是列表?你侥幸逃脱的机会有多大? [当然我不是认真的,但是真的,真的,认真:列表几乎肯定是错误的结构在这里使用。]
【解决方案2】:

string没有分配给new,它是pair 的数据成员。你的第二个delete 是一个错误。

也许它是使用new 分配的string 对象的副本,但如果是这样,那么您可能很久以前就泄露了原始对象。

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

【讨论】:

  • 我想在析构函数中释放列表中的所有内容。
  • @John:什么的析构函数?无论如何,我的观点是只有你知道删除对象是否合适,我不能告诉你。
  • 是的,我不需要这些对象。我正在实现 HashTable 的析构函数。
  • @John:很好,然后删除它们 :-) 但也要考虑智能指针。他们的工作是为您删除内容,并且正确使用您不必遍历列表,只需删除table。也可以使用智能指针,您可能根本不需要编写析构函数。
  • 我去看看。谢谢史蒂夫·杰索普先生!
【解决方案3】:

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

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*,这取决于是否有其他指针副本将在其他地方删除。大概没有,所以您的原始代码是正确的。正如另一个答案中指出的那样,使用智能指针会更容易,因此您不必担心。

【讨论】:

  • “你的代码甚至不应该编译”——它是delete &amp;(*it).first(注意与符号)。这当然是错误的,但为delete 提供了正确的类型,所以我认为它应该编译。
猜你喜欢
  • 1970-01-01
  • 2017-11-17
  • 2017-04-05
  • 1970-01-01
  • 2015-09-30
  • 2010-09-23
  • 2012-09-19
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多