C++ shared_ptr不会在程序结束时销毁对象

C++ shared_ptr不会在程序结束时销毁对象,c++,c++11,queue,smart-pointers,C++,C++11,Queue,Smart Pointers,我正在尝试使用智能指针实现一个Deque。但是,我注意到在程序结束时,Deque的节点没有被正确地破坏。 代码如下: #包括 #包括 类节点 { int值; std::shared_ptr next=nullptr; std::shared_ptr prev=nullptr; 公众: Node()=默认值; 节点(int val):值(val){} ~Node() { std::cout(3); DEQ.推回(节点1); DEQ.推回(节点2); 标准::cout 我假设问题是node1和nod

我正在尝试使用智能指针实现一个Deque。但是,我注意到在程序结束时,Deque的节点没有被正确地破坏。
代码如下:

#包括
#包括
类节点
{
int值;
std::shared_ptr next=nullptr;
std::shared_ptr prev=nullptr;
公众:
Node()=默认值;
节点(int val):值(val){}
~Node()
{
std::cout(3);
DEQ.推回(节点1);
DEQ.推回(节点2);
标准::cout
我假设问题是node1和node2的引用计数等于3

您的假设是正确的。在ref count降至零之前,共享指针不会销毁指向的对象

您知道如何更改实现以解决此问题吗

所有权图中没有循环。例如,您可以在列表的一个方向使用拥有智能指针,在另一个方向使用不拥有指针(可能是弱指针)

我假设问题是node1和node2的引用计数等于3

您的假设是正确的。在ref count降至零之前,共享指针不会销毁指向的对象

您知道如何更改实现以解决此问题吗


所有权图中没有循环。例如,您可以在列表的一个方向上使用拥有智能指针和非拥有指针(可能是弱指针)在另一个方向。

看看这个使用列表的类似例子。
std::shared\u ptr next=nullptr;std::shared\u ptr prev=nullptr;
是你自己的经典之作。;-)其中一个应该是
std::weak\u ptr
(我会投票支持
prev
)如果你用它建立一个双链接列表,每个节点都将拥有它的下一个节点,下一个节点也将拥有它的前一个节点。这会产生一个循环,没有人能够放弃所有权(没有外部干预)。这是由循环所有权产生的典型内存泄漏。当对象有指向其所有者的指针时,该指针不需要是智能指针,因为不存在生命周期问题。共享的ptr不是此作业的正确工具。请参阅使用列表的类似工具。
std::shared\u ptr next=nullptr;std::shared\u ptr prev=nullptr;
这是一个经典的例子。-)其中一个应该是
std::weak_ptr
(我会投票支持
prev
)如果你用它建立一个双链接列表,每个节点都将拥有它的下一个节点,下一个节点也将拥有它的前一个节点。这会产生一个循环,没有人能够放弃所有权(无外部干预)。这是由循环所有权产生的典型内存泄漏。当对象有指向其所有者的指针时,该指针不需要是智能指针,因为不存在生存期问题。shared_ptr不是此作业的正确工具。
Use count node1 = 3
Use count node2 = 3
Use count node3 = 1
Destructor of node: 3
Dequeue destructor