
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内存泄漏所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)