gpt4 book ai didi

c++ - unique_ptr 是否会控制它传递的任何指针,而不管它是如何创建的?

转载 作者:行者123 更新时间:2023-11-27 23:15:40 25 4
gpt4 key购买 nike

我一直在为 unique_ptrstd::vector 这样做:

m_stuff.push_back(std::unique_ptr<Thing> (new DerivedThing()));

这让我在删除 vector 中的元素时自动删除内存。

我有另一种情况,其中其他东西通过 new 创建堆内存,因此通用指针已经存在。现在,假设我这样做:

    m_stuff.push_back(std::unique_ptr<Thing> (thingy));
//thingy is Thing*

我是否可以安全地假设,只要我这样做,我的 vector m_stuff 现在就可以控制 thingy,这样当它从 vector 中移除时,它是 删除d?当然,如果 thingy 被复制或存储在别处,则可能存在悬空指针,但这是另一个问题。

最佳答案

简短的回答:是的。

更长的答案:您应该将通过立即分配内存创建的任何 指针存储到智能指针中。或者换句话说:(几乎)永远不要使用普通的 new , 除了 C++11 unique_ptr初始化。对于 shared_ptrmake_shared , 在 C++14 中会有 make_unique .

推论:不要这样做。 std::unique_ptr<Thing> (thingy)是错误的,要么是因为你没有管理thingy的内存从一开始就在智能指针中(那么你应该修复它),或者因为 thingy不拥有该对象,即它只是一个普通的引用指针,您不能窃取其他人的所有权以将其传递给 unique_ptr .当 unique_ptr 都满足时,您将获得 UB真正的主人试图摧毁这个物体。

关于c++ - unique_ptr 是否会控制它传递的任何指针,而不管它是如何创建的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16561684/

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