加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:53:37 所属栏目:百科 来源:网络整理
导读:我已经实现了一个简单的结构: struct ListenerNode{ ListenerNode() : previous(nullptr),next(nullptr),listener(nullptr),once(false) {} std::shared_ptrListenerNode previous; std::shared_ptrListenerNode next; std::functionvoid(int) listener; bo
我已经实现了一个简单的结构:

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

它没有泄漏记忆!我不明白这里发生了什么.我总是想在变量超出范围时立即创建一个类/结构的实例,而不会立即调用析构函数.

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

解决方法

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

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

在这种情况下,在调用_CrtDumpMemoryLeaks()时,n还没有超出范围.你绝对可以在_CrtDumpMemoryLeaks()之后访问n的内容而没有任何问题.在遇到main()的右括号后,n被破坏.

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

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

然后,当遇到额外的闭合支撑时,n被破坏.在调用_CrtDumpMemoryLeaks()时,n根本不可访问,因为它已经超出范围.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读