【问题标题】:Storing pointers owned by auto_ptr's in a vector causing a crash将 auto_ptr 拥有的指针存储在导致崩溃的向量中
【发布时间】:2013-10-03 01:29:16
【问题描述】:

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

谢谢

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 我相信你是对的。这是一个更大的实现的简化示例。感谢您的努力和帮助。我将把注意力集中在 ClassP 在被破坏时正在做什么。
  • 我知道 auto_ptr 已被弃用,宁愿使用 unique_ptr(我实际上是从 unique_ptr 开始的),但我意识到我必须支持不包含 unique_ptr 或 tr1 的旧编译器。使用 boost 也是不行的。
  • 未来的 C++ 版本可能会完全删除 auto_ptr,因此您可能需要使用 typedef#ifdef 来选择您使用的智能指针类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多