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根本不可访问,因为它已经超出范围. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |