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();
}