C++ 没有删除运算符的共享\u ptr内存泄漏

C++ 没有删除运算符的共享\u ptr内存泄漏,c++,c++11,memory-management,memory-leaks,shared-ptr,C++,C++11,Memory Management,Memory Leaks,Shared Ptr,我实现了一个简单的结构: struct ListenerNode { ListenerNode() : previous(nullptr), next(nullptr), listener(nullptr), once(false) {} std::shared_ptr<ListenerNode> previous; std::shared_ptr<ListenerNode> next; std::function<void(int)

我实现了一个简单的结构:

struct ListenerNode
{
    ListenerNode() : previous(nullptr), next(nullptr), listener(nullptr), once(false) {}
    std::shared_ptr<ListenerNode> previous;
    std::shared_ptr<ListenerNode> next;
    std::function<void(int)> listener;
    bool once;
};
它会泄漏内存,但当我像这样使用它时:

int main(int argc, char** argv)
{
    ListenerNode* n = new ListenerNode();
    delete n;
}
它不会泄漏内存!我不明白这里发生了什么。我一直认为,在不使用
new
的情况下创建类/结构的实例,在变量超出范围时会立即调用析构函数


有人能给我解释一下这里发生了什么事吗?我也没有看到任何明显的引用增量。

根据您的评论,您测试内存泄漏,如以下代码段所示:

int main(int argc, char** argv) 
{
    ListenerNode n;
    _CrtDumpMemoryLeaks();
}
在这种情况下,在调用
\u CrtDumpMemoryLeaks()
时,
n
尚未超出范围。您完全可以在
\u crtdumpmomeryleaks()
之后访问
n
的内容,没有任何问题<遇到
main()
的右括号后,code>n被销毁

如果添加一对额外的大括号:

int main(int argc, char** argv) 
{
    { ListenerNode n; }
    _CrtDumpMemoryLeaks();
}

然后,当遇到额外的右大括号时,
n
被销毁。调用
\u crtdumpmomeryleaks()
时,
n
根本不可访问,因为它已经超出范围。

如果使用类创建列表,将泄漏内存。永远不要使用shared_ptr创建周期(就像您使用next/previous所做的那样),它们不会删除任何内容


您不需要使用nullptr初始化shard_ptr

您如何知道它正在泄漏?
\u CrtDumpMemoryLeaks()
您在哪里调用
\u crtdumpmoryLeaks()
?如果您将
ListenerNode n带有一对额外的大括号?此时
n
还没有被销毁。
int main(int argc, char** argv) 
{
    { ListenerNode n; }
    _CrtDumpMemoryLeaks();
}