理论部分转载自 : http://blog.csdn.net/envenler/article/details/8020064
下面是代码部分:
QScopedPointer<myCls> p;
class myCls : public QWidget
{
Q_OBJECT
public:
explicit myCls(QWidget *parent = 0):QWidget(parent)
{qDebug()<<"myCls::myCls ";mstr="myCls--mstr";}
virtual ~myCls()
{qDebug()<<"~~~myCls::myCls ";}
QString mstr;
};
myCls *pcls = new myCls();
p.reset(new myCls(this));
运行结果:
myCls::myCls
myCls::myCls
~~~MainWindow::MainWindow
~~~myCls::myCls
---- 说明有内存泄露
同样代码改成myCls *pcls = new myCls(this);---- 没有内存泄露
class myCls : public QObject
{
Q_OBJECT
public:
explicit myCls(QObject *parent = 0):QObject(parent)
{qDebug()<<"myCls::myCls ";mstr="myCls--mstr";}
virtual ~myCls()
{qDebug()<<"~~~myCls::myCls ";}
QString mstr;
};
同样代码:说明没有内存泄露,说明在Qt中,维护了一张 QObject 层次关系表,父结点删除,子结点也删除
QScopedPointer<myCls,QScopedPointerArrayDeleter<myCls>> p(new myCls[5]());
心得:维护好父子关系,实在没有父子关系,就用QSharedPointer,用内存泄露工具,大都检查不出来。VLD内存泄露检测工具下载地址: http://vld.codeplex.com/releases/view/619330 对应网站上有使用说明 相关文档 : http://vld.codeplex.com/documentation ,运行的时候 ,把 D:\Program Files\Visual Leak Detector\bin\Win32 里面的内容复制到可执行EXE同级目录下。
http://jingyan.baidu.com/article/642c9d34e25cc2644b46f74b.html -- VS起动的时候 ,加载所有的DLL 的解决方案
https://vsprojectconverter.codeplex.com/ ---VS项目转换器的下载地址