gpt4 book ai didi

c++ - 尽管类型在析构函数中完全合格,但 std::auto_ptr 崩溃和泄漏

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

我读了C++: auto_ptr + forward declaration?及其答案,尤其是 accepted one并且我知道组合 auto_ptr 和前向声明的类时的陷阱。但是我遇到了这种相同模式的运行时问题,似乎没有包含在这个问答中(以及我检查过的所有其他 auto_ptr-tagged Questions)。

当销毁我的 Outer-like class[1] 时,我有时会遇到访问冲突,有时我只会观察到丢失的析构函数调用。

// Outer.h - an example header
#include <uncopyable.h>
#include <memory>
class Inner;

class Outer: private Uncopyable
{
public:
Outer()
~Outer();
private:
std::auto_ptr<Inner> inner;
};

我在 cpp 文件中实现构造函数和析构函数,那里存在 Inner 类型的定义。

// Outer.cpp - an example implementation
#include "Outer.h" //< I use this include order to ensure compileability
#include "Inner.h" //< for units including Outer.h without preconditions

Outer::Outer(): inner(new Inner) {}

Outer::~Outer() {}

如果我执行以下操作,所描述的问题就会消失:

  • Outer.h
  • 中包含 Inner.h
  • 显式调用 inner.reset()

我处理只能用 C++-Builder 6 编译的遗留代码,所以我必须坚持使用 std::auto_ptr,因为它是编译器唯一的 smart_ptr 实现似乎支持,所以(目前)没有这种类型的替代品(我知道 C++11 已弃用)。

我的问题:我在这里做错了什么,或者它可能是 BCB6[2] 中的一个众所周知的错误?


附加说明 在阅读 Herb Sutter 的文章 Using auto_ptr Effectively 后,我预计在不完整类型上使用 auto_ptr 是安全的, Wrapping Pointer Data Members 部分处理它。因此,我上面描述的问题是一个非常令人困惑的经历。


  • [1]这个例子被简化来讨论auto_ptr用法的形式结构。
  • [2] Borland C++ 5.6.4,以及 C++-Builder 6 (upd4) 附带的 STL

最佳答案

修复代码以在具有 unique_ptr 支持的较新编译器上编译比修复 auto_ptr 更容易(为什么你认为标准委员会完全扼杀了它? 因为他们认为它无法修复)。

关于c++ - 尽管类型在析构函数中完全合格,但 std::auto_ptr 崩溃和泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24309583/

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