gpt4 book ai didi

c++ - std::unique_ptr 在其拥有的对象被手动删除后超出范围时如何工作?

转载 作者:行者123 更新时间:2023-11-30 01:02:08 24 4
gpt4 key购买 nike

我可能没有正确措辞标题,但在下面的示例中更容易解释,然后也许有人可以编辑标题。

考虑以下代码片段:

#include <iostream>
#include <memory> // for std::unique_ptr

class Resource
{
public:
Resource() { std::cout << "Resource acquired\n"; }
~Resource() { std::cout << "Resource destroyed\n"; }
};

int main()
{
Resource* res = new Resource;
std::unique_ptr<Resource> res1(res); // Resource created here
delete res;

std::cout << "res1 is " << (static_cast<bool>(res1) ? "not null\n" : "null\n");

return 0;
}

这打印:

$ ./a.out 
Resource acquired
Resource destroyed
res1 is not null
Resource destroyed

我们创建了一个动态分配的资源,然后创建了一个拥有这个资源的唯一指针(res1)。唯一指针让我们不用担心必须手动删除资源。

但是假设我们像上面的代码一样手动删除了资源(之后没有将其设置为 null)。那么当 res1 超出范围时,它不会试图删除已经被释放的东西吗?

最佳答案

是的,在这种情况下,unique_ptr 将尝试在对象超出范围后将其删除。事实上,您上面显示的示例是说明 unique_ptr 的关键属性之一的完美方式:如果您有一个由 unique_ptr 管理的资源,您不应该尝试在 unique_ptr 之外自行管理该资源。毕竟,与 unique_ptr 的契约是“unique_ptr 独占该资源”,因此如果您拿走该资源并自行释放它,您就违反了契约。

换句话说,unique_ptr 的作用比“让我们不必担心必须手动删除资源”强一点。相反,它承担管理资源的全部责任。

例如,shared_ptr 可能会出现类似的问题,它假设资源的所有所有权在不同的 shared_ptr 之间共享到一个资源。

如果您想在函数返回之前显式释放资源,请使用reset 函数:

res1.reset(); // Cleans up the resource.

关于c++ - std::unique_ptr 在其拥有的对象被手动删除后超出范围时如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56710323/

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