C++ 为什么共享指针不删除内存?

C++ 为什么共享指针不删除内存?,c++,c++11,shared-ptr,C++,C++11,Shared Ptr,与Nico关联的内存确实会被删除 有人能解释一下区别吗 在程序结束时,当字符串的最后一个所有者 如果已销毁,共享指针将为其引用的对象调用delete 到这样的删除不一定要在最后发生 范围的限制 当引用计数达到0时,stringNico将被销毁。在您的示例中,Nico甚至在到达范围结束之前就达到了0 如果您与当前范围外的其他人共享(例如,具有返回共享\u ptr的函数),则它可能超出其范围,或者下面是一个更简单的示例: whoMadeCoffee.resize(2); pNico = nullpt

与Nico关联的内存确实会被删除

有人能解释一下区别吗

在程序结束时,当字符串的最后一个所有者 如果已销毁,共享指针将为其引用的对象调用delete 到这样的删除不一定要在最后发生 范围的限制

当引用计数达到0时,stringNico将被销毁。在您的示例中,Nico甚至在到达范围结束之前就达到了0

如果您与当前范围外的其他人共享(例如,具有返回共享\u ptr的函数),则它可能超出其范围,或者下面是一个更简单的示例:

whoMadeCoffee.resize(2);
pNico = nullptr;
继续生活

在程序结束时,当字符串的最后一个所有者 如果已销毁,共享指针将为其引用的对象调用delete 到这样的删除不一定要在最后发生 范围的限制

当引用计数达到0时,stringNico将被销毁。在您的示例中,Nico甚至在到达范围结束之前就达到了0

如果您与当前范围外的其他人共享(例如,具有返回共享\u ptr的函数),则它可能超出其范围,或者下面是一个更简单的示例:

whoMadeCoffee.resize(2);
pNico = nullptr;

继续生活

我真的不明白这个问题,你的例子中没有范围……看起来你误解了书中的句子的意思。为了完整起见,请包括紧接着的句子,并试着解释两个并列的句子。@Spirationage它将被删除,除非你与编译器有严重的问题-这是不可能的。为什么你认为它没有被删除?你是如何测试它的?在这种情况下,删除确实不会发生在范围的末尾,而是发生在更早的时候。我认为混淆的是句子,这样的删除不一定会发生在范围的末尾。我认为间谍活动明白,如果在范围结束时没有删除,那么删除本身根本不会发生。但这句话的意思不一定是在范围的末尾,但也可能发生在更早的时候。我不太理解这个问题,你的例子中没有范围……看起来你误解了书中这句话的意思。为了完整起见,请包括紧接着的句子,并试着解释两个并列的句子。@Spirationage它将被删除,除非你与编译器有严重的问题-这是不可能的。为什么你认为它没有被删除?你是如何测试它的?在这种情况下,删除确实不会发生在范围的末尾,而是发生在更早的时候。我认为混淆的是句子,这样的删除不一定会发生在范围的末尾。我认为间谍活动明白,如果在范围结束时没有删除,那么删除本身根本不会发生。但是这个句子的意思不一定是在范围的末尾,也可能发生在更早的时候。
shared_ptr<string> pNico0(new string(""));
{ 
    shared_ptr<string> pNico1(new string("Nico"));
    pNico0 = pNico1; // pNico0 reference count = 2
}
// pNico0 reference count = 1