0

我一直在为我std::vectorunique_ptrs 做这个:

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

这使我可以在删除向量中的元素时自动删除内存。

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

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

我可以安全地假设,一旦我这样做,我的向量m_stuff现在可以控制thingy当它从向量中删除时,它是deleted?当然,如果将指针thingy复制或存储在其他地方,则可能会出现悬空指针,但这是一个不同的问题。

4

3 回答 3

3

简短的回答:是的。

更长的答案:您应该通过立即将内存分配到智能指针中来存储您创建的任何指针。或者换一种说法:(几乎)永远不要使用 plain new,除非在 C++11unique_ptr初始化中。因为shared_ptrmake_shared,并且在 C++14 中会有make_unique.

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

于 2013-05-15T09:54:22.467 回答
1

unique_ptr没有什么神奇的。它只有一个常规构造函数(实际上它有几个),它接受一个类型的指针T并负责删除指针。所以是的,它不关心(也不关心)这个指针来自哪里

于 2013-05-15T09:52:17.490 回答
0

是的,这是正确的。一旦从原始指针构造,唯一指针就拥有指针。

于 2013-05-15T09:47:36.220 回答