我知道:
#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存在同样的问题。
答案 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_;
};
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 ++标准库的实现应该有这样的检查。