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