gpt4 book ai didi

c++ - auto_ptr 和前向声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:12:37 25 4
gpt4 key购买 nike

我知道这个:

#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: In destructor 'std::auto_ptr<_Tp>::~auto_ptr() [with _Tp = B]': test.hh:6: instantiated from here

blah/auto_ptr.h:173: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.

我们可以检测到这一点并在任何不良情况发生之前修复代码。有时这不再发生了。是否有任何编译器选项可以打开它(-Wall -Wextra -Wpedantic 似乎没有削减它)

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

最佳答案

unique_ptr没有这个问题,因为你在构造unique_ptr对象的时候绑定(bind)了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 的问题。

关于c++ - auto_ptr 和前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com