c++ - 将 auto_ptr 拥有的指针存储在导致崩溃的 vector 中

标签 c++ smart-pointers auto-ptr

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

谢谢

最佳答案

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

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

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

关于c++ - 将 auto_ptr 拥有的指针存储在导致崩溃的 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19149432/

相关文章:

c++ - Boost.Bind 与函数和 Python

c++ - CLion 导入具有依赖项的现有 cmake 项目

c++ - 了解 C++ std::shared_ptr

c++ - STL:: map 问题

c++ - 如何测试引用是否为 NULL?

C++ std:.auto_ptr 或 std::unique_ptr(支持多个编译器,甚至是旧的 C++03 编译器)?

c++:在原始指针映射中复制、删除和运算符=

c++ - 删除 boost::bind 的原始指针参数

c++ - 指针和智能指针的区别

c++ - 如何测试自动指针是否为空?