gpt4 book ai didi

C++ 强制使用 unique_ptr 进行动态分配?

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:33 25 4
gpt4 key购买 nike

我发现 unique_ptr 可以指向一个已经存在的对象。例如,我可以这样做:

class Foo {
public:
Foo(int nb) : nb_(nb) {}
private:
int nb_;
};

int main() {
Foo f1(2);
Foo* ptr1(&f1);
unique_ptr<Foo> s_ptr1(&f1);

return 0;
}

我的问题是:

如果我创建一个以 unique_ptr< Bar > 作为数据成员的类(其中 Bar 是一个复制构造函数被删除的类)和一个将指针作为参数,我可以阻止用户将已经存在的对象/变量作为参数传递(在该构造函数中)(即强制他使用 new 关键字)吗?因为如果他这样做,我将无法保证我的类对象的有效状态(用户仍然可以从类外部使用他们的地址修改数据成员)..而且我无法复制 Bar 到另一个内存区域。

示例:

class Bar {
public:
Bar(/* arguments */) { /* data members allocation */ }
Bar(Bar const& b) = delete;

/* Other member functions */

private:
/* data members */
};

class Bar_Ptr {
public:
Bar_Ptr(Bar* ptr) {
if (ptr != nullptr) { ptr_ = unique_ptr<Bar> (ptr); }
} /* The user can still pass the address of an already existing Bar ... */

/* Other member functions */

private:
unique_ptr<Bar> ptr_;
};

最佳答案

你不能阻止程序员做傻事。 std::unique_ptrstd::shared_ptr 都包含使用现有 ptr 创建实例的选项。我什至见过传递自定义删除器以防止删除的情况。 (对于这些情况,共享 ptr 更优雅)

所以如果你有一个指针,你必须知道它的所有权。这就是为什么我更喜欢使用 std::unique_ptrstd::shared_ptrstd::weak_ptr 作为“拥有”指针,而原始指针代表非拥有指针。如果您将其传播到创建对象的位置,大多数静态分析器会告诉您您犯了一个错误。

因此,我会将类 Bar_ptr 重写为:

class Bar_ptr {
public:
explicit Bar_ptr(std::unique_ptr<Bar> &&bar)
: ptr(std::move(bar)) {}
// ...
}

有了这个,您的类的 API 强制执行所有权转移,并且由调用者提供有效的 unique_ptr。换句话说,您不必担心传递未分配的指针。

没有人阻止调用者写:

Bar bar{};
Bar_ptr barPtr{std::unique_ptr<Bar>{&bar}};

尽管如果你有一个像样的静态分析器,或者甚至只是一个代码审查,我希望这个代码不会被拒绝。

关于C++ 强制使用 unique_ptr 进行动态分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36823837/

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