このプログラムはセグメンテーション違反ではなく、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; }