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

C++ 如何在删除类指针列表时删除分段错误,c++,segmentation-fault,C++,Segmentation Fault,我有两节课 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

我有两节课

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

}
A类{};
B类{
私人:
列表*我的列表;
删除();
};
void B::remove()//删除列表mylist的步骤
{
列表::迭代器iter=mylist->begin;
对于(;iter!=mylist->end;)
{
列表::迭代器iter1=iter++;
--iter;
删除(*国际热核实验堆);
mylist->擦除(iter);
iter=iter1;
}
}

我在删除功能中遇到分段错误,请纠正我哪里做错了。

永远不要重新发明轮子

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

此代码显示为清除列表。尽管如此

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

mylist->clear();
for(list::iterator it=mylist->begin();
it!=mylist->end();删除*it++);
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; }

泄露列表中的每个动态对象。A*什么时候是智能指针(我完全同意它应该是,但是=P)@WhozCraig,我正要加上:P也许这足以说服OP开始使用它们。我得告诉你,克里斯,你的帖子有时会让我崩溃。几天前,关于“你刚刚用两行字泄露了我的记忆”的评论把我带到了地板上,我笑得很厉害。对于ref:1,
mylist
似乎未初始化。请发布一个完整的、最少的示例程序来演示这个问题。有关更多信息,请参阅。如果仅写入
mylist->clear(),则再次出现分段错误然后我没有得到任何错误,但在这种情况下仍然存在内存泄漏。这意味着列表中的指针要么已经释放,要么首先是垃圾。我会检查它是如何填充的,并确保每个项目仍然有效。有没有可能他们在别的地方被删除了?
#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; }