如何在删除类指针列表时删除分段错误

how to remove segmentation fault while deleting list of class pointers

本文关键字:删除 分段 错误 列表 指针      更新时间:2023-10-16

我有两个类

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;
  }
}

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

此代码似乎擦除列表。话虽如此..

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

还是我错过了什么?

永远不要

重新发明轮子...

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

这个程序没有段错误,它在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; }

尽管如此,如果你为我编写那个程序,我会非常沮丧。

  • 它违反了三法则。
  • new是一个std::list.永远不要new标准容器,它只是浪费空间。
  • 它包含带有混乱所有权语义的裸指针。更喜欢std::list<A>.如果绝对需要指针,请使用 std::list<std::shared_ptr<A> >
  • 它不提供异常安全性。

如果你可以修改你的数据结构,这就是我编写程序的方式。请注意缺少显式析构函数、复制构造函数和赋值运算符。一切都很好。

#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; }