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

c – 没有删除 *** 作符的shared_ptr内存泄漏,第1张

概述我已经实现了一个简单的结构: struct ListenerNode{ ListenerNode() : previous(nullptr), next(nullptr), listener(nullptr), once(false) {} std::shared_ptr<ListenerNode> previous; std::shared_ptr<ListenerNo 我已经实现了一个简单的结构:

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根本不可访问,因为它已经超出范围.

总结

以上是内存溢出为你收集整理的c – 没有删除 *** 作符的shared_ptr内存泄漏全部内容,希望文章能够帮你解决c – 没有删除 *** 作符的shared_ptr内存泄漏所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1216186.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存