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

Storing pointers owned by auto_ptr's in a vector causing a crash

本文关键字:崩溃 向量 指针 auto ptr 拥有 存储      更新时间:2023-10-16

我在使用auto_ptr时遇到崩溃困难。 我知道您不能将auto_ptr存储在 STL 容器中。 但是,如何将auto_ptr持有的指针值存储在矢量中呢? 如果auto_ptr删除了它们指向的存储对象,则存储这些内部指针的向量随后的破坏会导致我的程序在 vectors 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删除其存储的指针时,矢量中的关联指针不再指向任何内容,但为什么这会阻止矢量正确破坏?

谢谢

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

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

意识到std::auto_ptr已被弃用,你应该改用std::unique_ptr,正如Ben Voigt所指出的那样。