zoukankan      html  css  js  c++  java
  • paip.c++ 内存泄漏以及解决之道.

    paip.c++ 内存泄漏以及解决之道.




    作者Attilax ,  EMAIL:1466519819@qq.com 
    来源:attilax的专栏
    地址:http://blog.csdn.net/attilax


    内存泄漏手动检测,最好使用工具来做.
    参考Qt内存泄漏问题 - envenler的专栏 - 博客频道 - CSDN.NET.htm


    //自己调用delete来删除通过new分配到heap中的 label 对象
    在C++中学习过程中,我们都知道:
    · delete 和 new 必须配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大。


    /使用Qt 智能指针
    /使用boost 智能指针,,STL智能指针


    //use QT new控件,但不delete,为什么没有内存泄露
    ----new控件 指定parent 父子关系 
    父子关系deleteLater父子关系 在Qt中,每个 QObject 内部都有一个list,用来保存所有的 children,还有一个指针,保存自己的parent。当它自己析构时,它会将自己从parent的列表中删除,并且析构掉所有的children。
    当我们使用父对象来创建一个对象的时候 ,父对象会把这个对象添加到自己的子对象列表中。当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。 这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。我们需要显试删除(就是用DELETE删除)的对象是那些使用NEW创建的并且没有父对象的对象(切记是new的才要delete,通过成员函数获得的对象,没有特殊说明的,千万不要随便delete.)


    Qt 自动回收不像Java这种,有垃圾回收机制。 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。 所以为什么 mai
    Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错






    :在Qt中,我们很多时候都疯狂地用new,却很少用delete,缺少的 delete 去哪儿了?! 注:本文暂不涉及智能指针(smart pointer)相关的东西,你可以考虑 Qt 智能指针学习 一文Qt半自动的内存管理在Qt中,以下情况下你new出的对象你可以不用亲自去delete (但你应该清楚delete在何处被Qt调用的,怎么被调用的


    /分配对象到stack而不是heap中
    QLabel label("Hello Qt!"); label.show();


    设置标志位,这样,当我们点击关闭按钮时,close()函数将会调用deleteLater
    label->setAttribute(Qt::WA_DeleteOnClose);


    参考:
    QT内存泄露问题_cgzhello_新浪博客.htm
    Qt 智能指针学习 - 1+1=2 - 博客频道 - CSDN.NET.htm
  • 相关阅读:
    ndoejs解析req,伪造http请求
    ndoejs创建多重文件夹
    路径path的正则通配符-nodejs
    例题1.5 快速排序
    例题1.3 整数划分问题
    sdcf day4 qaq模拟赛总结
    P1168 中位数
    浅谈LCA
    sdcf day1 qwq比赛题解
    2019山东夏令营划水记
  • 原文地址:https://www.cnblogs.com/attilax/p/15199483.html
Copyright © 2011-2022 走看看