如何在删除类指针列表时删除分段错误
how to remove segmentation fault while deleting list of class pointers
我有两个类
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; }
相关文章:
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 删除链表中的节点 - 分段错误
- 在C++中,当指向删除和指向不同对象时,分段故障指针
- 尝试从动态分配的二维数组 C++ 中读取值时出现分段错误,并在尝试删除它时给出 munmap_chunk():
- 删除cout会导致分段错误
- 为什么我的删除功能总是出现分段错误
- 如何修复重新平衡时AVL删除操作中的分段错误?
- 删除阵列时出现分段错误
- 我写了此方法来删除链接列表的重复元素,但它显示了分段故障,原因
- 分段错误从矩阵中删除行
- 删除导致分段错误的 []
- GCC:使用删除时出现分段错误
- 删除指针的分段错误
- 尝试从链表中删除节点时出现分段错误
- 从双向链表末尾删除节点时出现分段错误
- 删除模板化数组时出现分段错误
- 如何在删除类指针列表时删除分段错误
- PCL 删除分段表下的点
- C++二进制搜索树删除分段错误
- 即使使用虚拟析构函数也会出现删除分段错误