auto_ptr和转发声明

时间:2016-07-27 08:13:41

标签: c++ gcc-warning

我知道:

#include <memory>
class A;
class B 
{ 
  public:
      B(A* a) : a_(a) {}
  private:
      std::auto_ptr<A> a_;
};

与未定义的行为发生冲突,除非您有B::~B();

的脱节定义

有一次,gcc过去常说:

  

blah / auto_ptr.h:在析构函数&st; :: auto_ptr&lt; _Tp&gt; ::〜auto_ptr()[with _Tp = B]&#39;:test.hh:6:从这里实例化

     

blah / auto_ptr.h:173:注意:即使在定义类时声明它们,也不会调用析构函数或类特定的运算符delete。

我们可以在发生任何不良事件之前检测到并修复代码。有时这种情况不复存在了。是否有任何编译器选项来打开它(-Wall -Wextra -Wpedantic似乎没有切断它)

注意:由于各种原因,移动到C ++ 11和unique_ptr不是一个选项,据我所知,unique_ptr存在同样的问题。

2 个答案:

答案 0 :(得分:1)

unique_ptr没有这样的问题,因为在构造unique_ptr对象时绑定了deletor:

  struct A;
  struct B {
    std::unique_ptr<A> p;
  };
  struct A {
    ~A() {
    }
  };
  {
    B b;
    b.p = std::unique_ptr<A>(new A()); // here is you bind default_deletor of already completed type
  }

结果,生成的B类析构函数正确地破坏了p成员。

<强>更新

如果您不打算迁移到C ++ 11,那么您可以使用unique_ptr智能指针来消除auto_ptr的问题。

答案 1 :(得分:0)

实际上...

libstdc ++使std::unique_ptr实例化编译器错误:

#include <memory>
class A;
class B 
{ 
  public:
      B(A* a) : a_(a) {}
  private:
      std::unique_ptr<A> a_;
};

Live on Coliru

In file included from /usr/local/include/c++/6.1.0/memory:81:0,
                 from main.cpp:1:
/usr/local/include/c++/6.1.0/bits/unique_ptr.h: In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = A]':
/usr/local/include/c++/6.1.0/bits/unique_ptr.h:236:17:   required from 'std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = A; _Dp = std::default_delete<A>]'
main.cpp:6:21:   required from here
/usr/local/include/c++/6.1.0/bits/unique_ptr.h:74:22: error: invalid application of 'sizeof' to incomplete type 'A'
  static_assert(sizeof(_Tp)>0,

虽然似乎不需要进行这样的检查,但实现起来很简单,因此C ++标准库的实现应该有这样的检查。