shared_ptr内存泄漏没有删除操作符

Sep*_*ehr 3 c++ memory-leaks memory-management shared-ptr c++11

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

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;
};
Run Code Online (Sandbox Code Playgroud)

这将代表场景图实现中的一个实体.我观察到的奇怪行为是当我使用结构时,就像:

int main(int argc, char** argv)
{
    ListenerNode n;
}
Run Code Online (Sandbox Code Playgroud)

它泄漏了内存,但当我使用它时:

int main(int argc, char** argv)
{
    ListenerNode* n = new ListenerNode();
    delete n;
}
Run Code Online (Sandbox Code Playgroud)

它没有泄漏记忆!我不明白这里发生了什么.我一直认为,new当变量超出范围时,不要立即调用析构函数来创建类/结构的实例.

有人可以向我解释这里发生了什么吗?我也没有看到任何明显的参考增量.

tim*_*rau 7

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

int main(int argc, char** argv) 
{
    ListenerNode n;
    _CrtDumpMemoryLeaks();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在_CrtDumpMemoryLeaks()被调用的时候,n还没有超出范围.你一定可以访问的内容n后,_CrtDumpMemoryLeaks()没有任何问题.nmain()遇到闭合支撑后被破坏.

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

int main(int argc, char** argv) 
{
    { ListenerNode n; }
    _CrtDumpMemoryLeaks();
}
Run Code Online (Sandbox Code Playgroud)

然后,n在遇到额外的闭合支撑时被破坏.在您致电时_CrtDumpMemoryLeaks(),n根本无法访问,因为它已经超出范围.