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