C++ 为什么将原始指针强制转换为唯一的\u ptr不会删除原始指针?

C++ 为什么将原始指针强制转换为唯一的\u ptr不会删除原始指针?,c++,unique-ptr,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 ); PartClass*part=新的PartClass; //OwnerClass是一个复合类

我试图理解unique_ptr,但他们让我有点困惑。 考虑下面的代码:

PartClass * part= new PartClass;

//The OwnerClass is a composite that excpects a unique_ptr
OwnerClass * owner = new OwnerClass( unique_ptr<PartClass>( part );
PartClass*part=新的PartClass;
//OwnerClass是一个复合类,它包含一个独特的
OwnerClass*owner=新的OwnerClass(唯一的部分);

在第二行代码之后,我希望原始指针(part)已经被删除。毕竟,一旦你有了唯一的ptr,它就会产生很多麻烦,需要移动等等。那么为什么编译器允许原始指针仍然访问part对象呢?它不违反了唯一ptr的整个概念吗?

a
unique\p从编译器的角度来看,r
只是另一个类。目前,它的一个CTOR接受一个原始指针。它的dtor将通过传入的原始指针释放内存(通常是
free

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


您确实持有指向通过
unique\u ptr
管理的同一内存的原始指针(顺序无关紧要),这可能会导致双重空闲和未定义的行为(希望是崩溃)。我建议将
新PartClass
直接传递给
唯一的ptr
初始化。

A
唯一的ptr
从编译器的角度来看只是另一个类。目前,它的一个CTOR接受一个原始指针。它的dtor将通过传入的原始指针释放内存(通常是
free

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


您确实持有指向通过
unique\u ptr
管理的同一内存的原始指针(顺序无关紧要),这可能会导致双重空闲和未定义的行为(希望是崩溃)。我建议将
新PartClass
直接传递到
唯一\u ptr
初始化。

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

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

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

它的工作原理与您可以显式给出指针的原因相同例如:

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

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

通过将
部分
传递到您传递的
唯一\u ptr
指向
唯一\u ptr
的指针的名称


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

< P>通过<代码>部分<代码> > <代码> UnQuyPPTR < /代码>。

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

< p> <代码> PartClass <代码>对象仍然存在,这就是我们想要的,所以绝对不应该被删除。问题是为什么不是代码>部分< /代码>集合?指向空指针,这是因为这是由您来管理的。指针是有效的,如果您想使用它,您可以使用它。如果您不想使用它,请不要保留它。

PartClass对象仍然存在,这是您的意图,因此绝对不应该删除它。问题是为什么
pa不存在rt
设置为空指针,这是因为这是由您来管理的。指针是有效的,如果您想使用它,您可以使用它。如果您不想使用它,请不要保留它。

部分
不会被删除,因为所有权将移动到
所有者类
,假设
所有者类
将其存储在som中ewhere.这就是你所困惑的吗?“那么为什么编译器允许原始指针仍然访问part对象?它不违反unique_ptr的整个概念吗?”这是一个自由的世界(更像编译器),您可以
删除42;
如果您愿意,编译器不会询问您的意图,如果您想除以零,他不会阻止您,您可以决定是使用原始指针还是正确的
唯一\u ptr
,这里没有
规则,有时您可能想进行黑客攻击并使用原始..您似乎有对指针有很大的误解,如果
unique\u ptr
将删除
部分
,他将如何使用它?如果你说的是
部分
本身,而不是它的引用内容,那么它会被分配到堆栈上用于此范围,并且在你离开范围时会被删除。可能有很多有效的理由坚持符号“part”。如果您希望“强制”只存在唯一的\u ptr,只需使用匿名符号即可创建它,即新的OwnerClass(唯一的\u ptr(新的PartClass))。Pete(参见他的答案)我的问题是,为什么原始指针没有设置为空指针。移动语义会这样做,但显然不会删除
part
,因为所有权将被移动到
OwnerClass
,假设
OwnerClass
将其存储在某个地方。这是你所困惑的吗?那么为什么编译器允许原始指针指向静态ac