gpt4 book ai didi

c++ - 使用 std::auto_ptr 数据成员是否调用 UB?

转载 作者:行者123 更新时间:2023-11-28 08:25:18 31 4
gpt4 key购买 nike

作为 Class containing auto_ptr stored in vector 的后续行动,我相信未说明的结论是可以使用具有 auto_ptr 成员的类作为容器元素,只要 both 复制构造和复制赋值是用户定义的(以免调用 auto_ptr 的复制构造函数和复制赋值)。这是否有任何违反标准库要求的地方?

如果以下内容有任何问题,请告诉我,因为我想按照惯用的方式开始做:

#include <memory>
#include <algorithm>

class Y { /* ... */ };
class Z : public Y { /* ... */ };

class X {
public:
X() : ap(new Z()) {}
X(const X& other) : ap(other.ap->clone()) {}
X& operator=(X other) { swap(other); return *this; } // any problem with swap?
void swap(X& other) { std::swap(ap, other.ap); }
// note no destructor necessary
private:
std::auto_ptr<Y> ap; // Y provides clone()
};

请注意,我意识到的一件事是,使用这种方法,Y 的类定义必须在 X 的定义范围内(而不是仅仅当使用指向 Y 的“原始”指针时前向声明)。这是因为当 auto_ptr 实例化时,它的析构函数必须在 Y 上调用 delete,所以 Y 不能是不完整的类型。我认为在类 X 管理多个资源(具有多个 auto_ptr 成员)的情况下,必须权衡 RAII 的值。对此有什么想法吗?

我认为这项技术总体上很棒,可以消除类的许多棘手代码,这些类可能必须构造/破坏/复制潜在的多个资源(单一责任主体)。我只是想知道 auto_ptr 是否达到了目的,或者它是否因为某些微妙的语言/标准库要求而在这里不起作用。

请注意,我知道其他类型的智能指针,但我正在实现一个库接口(interface),我不想对我的客户强加任何 Boost 或 TR1 的要求。任何关于 auto_ptr 的一般使用的讲座都会被否决!

最佳答案

当析构函数超出范围时使用 auto_ptr 确实会导致未定义的行为。 MSVC 对此发出警告。 GCC 没有。

您可以让它工作,但前提是析构函数未定义为内联函数。

unique_ptr 和 scoped_ptr 解决了这个问题。至少对于那些你可以避免意外编写未定义的代码。

关于c++ - 使用 std::auto_ptr 数据成员是否调用 UB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4260100/

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