我想了解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的整个概念?
答案 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
设置为空指针,而这是因为你需要管理这些事情。指针有效,如果您愿意,可以使用它。如果你不想使用它,请不要随意使用它。