为什么要将一个指向unique_ptr的原始指针转换为不删除原始指针?

时间:2016-04-13 13:15:15

标签: c++ unique-ptr

我想了解unique_ptr,但他们让我有点难过。 请考虑以下代码:

PartClass * part= new PartClass;

//The OwnerClass is a composite that excpects a unique_ptr
OwnerClass * owner = new OwnerClass( unique_ptr<PartClass>( part );

在第二行代码之后,我希望原始指针 - 部分 - 被删除。毕竟,只要你有一个unique_ptr就会产生很多麻烦,需要移动等等。那么为什么编译器允许原始指针仍然访问part-object?它是否违反了unique_ptr的整个概念?

4 个答案:

答案 0 :(得分:2)

它的工作原理与您可以明确指出指针的原因相同。例如:

std::unique_ptr<int> value = std::make_unique<int>(1);
int* pValue = value.get();

虽然pValue可以访问内存但不拥有,但不应删除内存。在你的例子中,所有权已被转移,而恰好有一个仍然指向资源的原始指针,这很好。

答案 1 :(得分:1)

从编译器的角度来看,unique_ptr只是另一个类。就目前而言,其中一个ctors接受一个原始指针。它的dtor将通过传入的原始指针(通常为free)释放内存。

您的变量部分指向相同的内存位置这一事实不会改变任何unique_ptr行为。在这种情况下,这只是另一个本地对象。

你确实拥有一个指向通过unique_ptr管理的同一内存的原始指针(顺序无关紧要)可能会导致双重释放和未定义的行为(希望崩溃)。我建议您将new PartClass直接传递给unique_ptr初始化。

答案 2 :(得分:1)

part传递给您通过unique_ptr指针所有权的unique_ptr

是的,你仍然有一个原始指针,但是当你拥有智能指针的所有权时,你应该考虑它的限制。你当然不想删除它。

答案 3 :(得分:1)

PartClass对象仍然存在,而且这意味着什么,所以绝对不应该删除它。这个问题实际上是为什么不是part设置为空指针,而这是因为你需要管理这些事情。指针有效,如果您愿意,可以使用它。如果你不想使用它,请不要随意使用它。