【问题标题】:how to remove segmentation fault while deleting list of class pointers如何在删除类指针列表时删除分段错误
【发布时间】:2012-09-19 23:10:17
【问题描述】:

我有两门课

class A{};

class B{
Private:
 list<A*> * mylist;
 remove();

};

void B:: remove() // To remove list mylist
{
  list<A*>::iterator iter = mylist->begin;
  for(;iter!=mylist->end;)
  {
    list<A*>::iterator iter1 = iter++;
    --iter;
    delete (*iter); 
    mylist->erase(iter);
    iter = iter1;
  }

}

我在删除功能中遇到分段错误,请纠正我做错的地方。

【问题讨论】:

  • 一方面,mylist 似乎未初始化。请发布一个完整的、最小的示例程序来演示该问题。请参阅ssccee.org 了解更多信息。

标签: c++ segmentation-fault


【解决方案1】:

此代码似乎要擦除列表。这么说吧。。

for (list<A*>::iterator it = mylist->begin();
   it != mylist->end(); delete *it++);

mylist->clear();

还是我错过了什么?

【讨论】:

  • 如果我只写mylist-&gt;clear();,我会再次遇到分段错误,然后我不会遇到任何错误,但在这种情况下仍然存在内存泄漏。
  • 这意味着列表中的指针要么已经被释放,要么首先被垃圾。我会检查它是如何填充的,并确保每个项目仍然有效。他们有可能在其他地方被删除吗?
【解决方案2】:

永远不要重新发明轮子...

void B::remove()
{
    mylist.clear();
}

【讨论】:

  • 泄露列表中的每个动态对象。
  • A* 什么时候是智能指针(我完全同意它应该,但是 =P)
  • @WhozCraig,我正要补充:p 也许这足以说服 OP 开始使用它们。
  • 得告诉你克里斯,你的帖子有时会让我崩溃。几天前,“你只是在两行中泄露了内存”的评论把我带到了地板上,我笑得很厉害。参考:stackoverflow.com/questions/12575825/…
【解决方案3】:

这个程序没有segfault,在valgrind下运行成功:

#include <list>

class A{};

class B{
public:
  B() {
    mylist = new std::list<A*>;
    mylist->push_back(new A);
    mylist->push_back(new A);
  }
 ~B() { remove(); }

private:
 std::list<A*> * mylist;
 void remove();
};

void B:: remove() // To remove list mylist
{
  std::list<A*>::iterator iter = mylist->begin();
  for(;iter!=mylist->end();)
  {
    std::list<A*>::iterator iter1 = iter++;
    delete (*iter1); 
    mylist->erase(iter1);
  }
  delete mylist;
  mylist = 0;
}

int main () { B b; }

不过,如果你为我写了那个程序,我会很不高兴。

  • 它违反了三法则。
  • news 和 std::list。永远不要new 标准容器,这只会浪费空间。
  • 它包含具有混淆所有权语义的裸指针。首选std::list&lt;A&gt;。如果您绝对需要指针,请使用std::list&lt;std::shared_ptr&lt;A&gt; &gt;
  • 它不提供异常安全性。

如果你可以修改你的数据结构,我会这样写你的程序。请注意缺少显式析构函数、复制构造函数和赋值运算符。 一切正常。

#include <list>

class A{};

class B{
public:
  B() {
    mylist.push_back(A());
    mylist.push_back(A());
  }

private:
 std::list<A> mylist;
 void remove();
};

void B:: remove() // To remove list mylist
{
  mylist.clear();
}

int main () { B b; }

【讨论】:

    猜你喜欢
    • 2011-04-30
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多