将auto_ptr所拥有的指针存储在导致崩溃的向量中

时间:2013-10-03 01:29:16

标签: c++ smart-pointers auto-ptr

我使用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删除其存储的指针时,向量中的关联指针不再指向任何东西,但为什么会阻止向量正确破坏?

由于

1 个答案:

答案 0 :(得分:0)

如图所示,当添加一个不执行任何操作的存根ClassP时,该程序没有问题(并且在需要时添加了class,并且main()已更改为返回int })。您观察到的行为可能是由于内存损坏。

如果ClassAClassBClassP中的任何一个或全部实际上具有非平凡的析构函数,则至少有一个析构函数实现可能存在导致未定义的错误行为。你应该把注意力集中在那上面。

意识到std::auto_ptr已弃用,您应该使用std::unique_ptr代替,如Ben Voigt所述。