c++ - 没有删除运算符的 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)> 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/

相关文章:

c++ - 为位图设置 unsigned int 时出现问题

c++ - 带有 if 语句的字符串

c++ - 应用具有通用引用的 SFINAE 模式

c++ - 使用过多内存的文件解析 (C++)

c - free(ptr) where ptr is NULL 会损坏内存吗?

linux - Linux 中的直接内存访问

c++ - 在C++ Builder 10.3中使用ENet会导致“在命名空间std中没有名为'strftime'的成员”的问题

c++ - gthr-default.h 中的多重定义

lambda - C++0x lambda 返回值类型推断规则

c++ - Priority_queue 的基于范围的 for 循环