gpt4 book ai didi

C++/pimpl : raw pointer or unique_ptr? 什么是更好的选择?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:52 26 4
gpt4 key购买 nike

当您使用 unique_ptr<T>对于前向声明类型 T , unique_ptr析构函数需要 T是完整的,但移动赋值运算符也是如此(和 reset ),根据此表:

https://stackoverflow.com/a/6089065/1794803

因此,对于您的 pImpl成语,要正确实现它,你必须声明 deletemove assignment method (作为副作用,将它们标记为非内联):

class impl_t;

class A
{
std::unique_ptr<impl_t> p_impl;

public:
// Implement in A.cpp as A::~A() = default;
~A();

// Implemented in A.cpp as A& operator=(A&&) = default;
A& operator=(A&& he);
};

但是,由于 std::unique_ptr是动态内存的 RAII 解决方案,而您 pImpl已经在一个类中了,无论如何你都被迫编写一个析构函数,只管理一个原始指针不是更好吗,因为从p_impl的角度来看,你的类已经是一个类似 RAII 的类了。 ?:

class impl_t;

class A
{
impl_t* p_impl;

public:
~A(); // The destructor must be written anyway.

// The omitted move assignment destructor doesn't cause UB.
};

这不是更好的解决方案吗? (+ 定义或删除您自己的复制/移动运算符,如果您想要类是否可复制/移动;但这是一个“有意识的选择”;但是,不要为 unique_ptr 编写移动分配是错误的)。

使用 unique_ptr只节省你写一个delete p_impl在你必须声明的析构函数中。

unique_ptr是局部动态对象的绝佳选择,即使在出现异常的情况下也会被破坏,但是对于“属性”,如果您不记得必须重写移动赋值运算符,除了获得 UB 的可能性外,您什么都不会保存。

最佳答案

好吧,使用 std::unique_ptr 可以让您免于为 p_impl 显式 delete 而烦恼.

它在并发访问的情况下和构造函数中的异常情况下也应该能很好地工作(这似乎不能保证使用原始指针和 new 你自己)。

关于C++/pimpl : raw pointer or unique_ptr? 什么是更好的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41078323/

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