編集:答えてくれてありがとう!tellSomething
メソッドを戻り値の型で宣言しましたが、std::string
そうである必要がありますvoid
。
私はつまずいて、罪のないかわいそうなdelete
オペレーターのせいにしました:)!
vector
動的に割り当てられたオブジェクトへのポインターを含む、動的に割り当てられたオブジェクトへのポインターを考えてみましょう。
// Create the vector of pointers
std::vector<A *>* v = new std::vector<A *>;
// Create two objects
A *a1 = new A;
A *a2 = new A;
// Populate the vector
v->push_back(a1);
v->push_back(a2);
// Delete the vector
delete v;
// Try accessing one of the objects
a1->tellSomething(); --> // Segmentation fault
予想どおり、 を削除するvector
と、delete
含まれているオブジェクトの は呼び出されません (上記のコードで が呼び出されないことも確認しA::~A()
ました) が、最後の命令でセグメンテーション エラーが発生します。
私が期待するのdelete v
は、次の 2 点です。
- 含まれているすべてのオブジェクトのデストラクタが呼び出されます
- コンテナの割り当てが解除されました
ただし、この場合、含まれているオブジェクトはポインターであるため、デストラクタは呼び出されません。
また、リストの最後にa1
はありません。NULL
では、なぜセグメンテーション違反なのでしょうか?
ここに完全な例があります: http://ideone.com/r8YC0。
注: 通常、STL コンテナーで生のポインターを使用することはありません。このコードは、delete v
命令のロジックを理解するのに役立つ純粋に理論的な例と考えてください。