我实现了一个简单的结构:
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;
}
它会泄漏内存,但当我使用它时:
int main(int argc, char** argv)
{
ListenerNode* n = new ListenerNode();
delete n;
}
它不会泄漏内存!我不明白这是怎么回事。我一直认为在不使用 new
的情况下创建类/结构的实例会在变量超出范围时立即调用析构函数。
有人可以向我解释一下这是怎么回事吗?我也没有看到任何明显的引用增量。
最佳答案
根据您的评论,您按照以下代码片段测试内存泄漏:
int main(int argc, char** argv)
{
ListenerNode n;
_CrtDumpMemoryLeaks();
}
在这种情况下,在调用 _CrtDumpMemoryLeaks()
时,n
尚未超出范围。在 _CrtDumpMemoryLeaks()
之后,您绝对可以毫无问题地访问 n
的内容。 n
在遇到 main()
的右大括号后被破坏。
如果你多加一对大括号:
int main(int argc, char** argv)
{
{ ListenerNode n; }
_CrtDumpMemoryLeaks();
}
然后,n
在遇到额外的右大括号时立即被破坏。在您调用 _CrtDumpMemoryLeaks()
时,n
根本不可访问,因为它已经超出范围。
关于c++ - 没有删除运算符的 shared_ptr 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25028516/