1

auto_ptr を使用したクラッシュで問題が発生しています。auto_ptr を STL コンテナーに格納できないことは承知しています。しかし、auto_ptr が保持するポインター値をベクター内に格納する場合はどうでしょうか? auto_ptr がそれらが指す格納されたオブジェクトを削除すると、これらの内部ポインターを格納したベクターがその後破棄されると、ベクターの Tidy_ メソッドでプログラムがクラッシュします。

ClassA {
public:
   ClassA() {
      auto_pointer_1_.reset(new ClassP());
      auto_pointer_2_.reset(new ClassP());
      auto_pointer_3_.reset(new ClassP());
   };

   std::auto_ptr<ClassP> auto_pointer_1_;
   std::auto_ptr<ClassP> auto_pointer_2_;
   std::auto_ptr<ClassP> auto_pointer_3_;

};

ClassB {  
public: 
   ClassB(ClassA& a_class_a_) {
      vector_of_pointers_.push_back(a_class_a_.auto_pointer_1_.get());
      vector_of_pointers_.push_back(a_class_a_.auto_pointer_2_.get());
      vector_of_pointers_.push_back(a_class_a_.auto_pointer_3_.get());
   };

   std::vector<ClassP*> vector_of_pointers_;
};

void main(void) {

   ClassA* class_a_variable_ = new ClassA();

   ClassB* class_b_variable_ = new ClassB(*class_a_variable_);

   delete class_a_variable_;
   delete class_b_variable_;  <--- CRASH in std::vector Tidy_ method
}

クラッシュが発生する理由を誰かに説明してもらえますか? auto_ptr が格納されたポインターを削除すると、ベクター内の関連付けられたポインターはもはや何も指していませんが、なぜベクターが適切に破棄されないのでしょうか?

ありがとう

4

1 に答える 1

0

ClassP示されているように、何もしないスタブが追加された場合 (class必要に応じて追加さmain()れ、 return に変更された場合)、プログラムに問題はありませんint。観察された動作は、メモリの破損が原因である可能性があります。

のいずれかまたはすべてClassAClassBまたはClassP実際に重要なデストラクタがある場合、それらのデストラクタの実装の少なくとも 1 つに、未定義の動作を引き起こすバグがある可能性があります。そこに注意を向けるべきです。

Ben Voigt が指摘したように、これは非推奨であり、代わりに使用std::auto_ptrする必要があることに注意してください。std::unique_ptr

于 2013-10-03T03:25:26.573 に答える