一个内存释放问题,百思不得其解,请教各位

zhenzhouxingxing 2011-02-17 01:46:13

class myDialog: public QDialog
{
public:
myDialog();
~myDialog();
private:
QDirModel *m_pDirModel;
};
myDialog::myDialog()
{
ui.setupUi(this);
m_pDirModel = new QDirModel( this );
ui.m_pTree->setModel( m_pDirModel );//ui是对话框资源,m_pTree是一个QTreeView
}
myDialog::~myDialog()
{
if (m_pDirModel)
delete m_pDirModel;
}

我想我的代码没什么问题吧,可是每次打开对话框,然后关闭,内存就会比打开前多一点,不断打开关闭,内存会不断上升,不知道哪儿泄漏了,请各位赐教!
...全文
349 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
passion_wu128 2012-02-10
  • 打赏
  • 举报
回复
当点击关闭或调用close()函数时,如果没有设置WA_DeleteOnClose属性(默认未设置),窗口只是被隐藏了。
如果再调用show,被关闭的窗口又会显示出来,我也很好奇这些被关闭的窗口占用的内存何时才会被释放掉。
xiangpengmeng 2011-12-03
  • 打赏
  • 举报
回复
close()并不会delete, 需要设置deleteonclose的时候才会调用构造函数。
三条猫 2011-11-22
  • 打赏
  • 举报
回复
一个猜想,感觉QDirModel是不是和QString之类的存在深拷贝和浅拷贝,你将他设置到了Tree上,等于是将QDirModel创建的对象浅拷贝了一次,实例计数器加了1,你在删除的时候并没有将QDirModel从Tree上解绑定,实例计数器没有清0,所以删除指针时,并没有删除到真正的内容,所以内存一直涨。
tt2com 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gemfield 的回复:]

指针被delete之后,按道理说,它所指向的空间已经被释放.但实际上操作系统出于效率和管理的考虑,内存空间是按照4KB大小分配的,你分配的4B大小的整数常常和别的变量空间在一个4KB页内,只有全都释放的情况下,才可能真正释放。
[/Quote]
大神我也遇到类似问题但是设置button 的ICON。我debug看 指针是free的状态,但那块内存就是释放不掉。如果按照你的说法,应该怎么做才能使得内存释放?
gemfield 2011-02-19
  • 打赏
  • 举报
回复
指针被delete之后,按道理说,它所指向的空间已经被释放.但实际上操作系统出于效率和管理的考虑,内存空间是按照4KB大小分配的,你分配的4B大小的整数常常和别的变量空间在一个4KB页内,只有全都释放的情况下,才可能真正释放。
zhenzhouxingxing 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cdqy 的回复:]
析构函数没有delete ui;
[/Quote]
ui并不是指针类型呀
cdqy 2011-02-18
  • 打赏
  • 举报
回复
析构函数没有delete ui;
zhenzhouxingxing 2011-02-18
  • 打赏
  • 举报
回复
还有哪位能给点提示啊
zhenzhouxingxing 2011-02-18
  • 打赏
  • 举报
回复
写了个测试程序
QDirModel *p = NULL;
for (int i = 0; i<100; i++)
{
p = new QDirModel();
delete p;
}
执行完这段后,内存一点也没有释放
这是为什么呢?
zhenzhouxingxing 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yangglemu 的回复:]
检查下你实例化此对话框的地方,分析其生命周期

Qt中如果指定了父部件,当父部件要死亡时,会自动杀死其所有子部件,不用刻意去Delete
[/Quote]
对话框对象为局部变量,作用范围为函数范围
指定了父后是不用刻意delete子,但现在问题是不管delete与否,问题依然存在
  • 打赏
  • 举报
回复
检查下你实例化此对话框的地方,分析其生命周期

Qt中如果指定了父部件,当父部件要死亡时,会自动杀死其所有子部件,不用刻意去Delete
zhenzhouxingxing 2011-02-17
  • 打赏
  • 举报
回复
重新发一下原始代码:

//头文件
#include <QStringList>
#include <QModelIndex>
#include <QDirModel>
#include <QtGui/QDialog>
#include "ui_ESSeUpLoadFileOpenDlg.h"

class ESSeUpLoadFileOpenDlg : public QDialog
{
Q_OBJECT

public:
ESSeUpLoadFileOpenDlg(QWidget *parent = 0, Qt::WFlags flags = 0);
~ESSeUpLoadFileOpenDlg();

QStringList GetSelectedFile();
QStringList GetSelectedDir();
QString GetRememberPath();
private:
Ui::ESSeUpLoadFileOpenDlgClass ui;
QDirModel *m_pDirModel;
QDirModel *m_pDirModelLst;
QStringList m_lstSelectedFile;
QStringList m_lstSelectedDir;
private slots:
void OnTreeClicked( const QModelIndex & index );
void OnOK();
void OnCancel();
};
//源文件
ESSeUpLoadFileOpenDlg::ESSeUpLoadFileOpenDlg(QString qsRememberPath,QWidget *parent, Qt::WFlags flags)
: QDialog(parent, flags)
{
ui.setupUi(this);
m_pDirModel = NULL;
m_pDirModelLst = NULL;
m_qsRememberPath = qsRememberPath;
m_pDirModel = new QDirModel( this );
m_pDirModel->setSorting(QDir::DirsFirst | QDir::IgnoreCase);
m_pDirModelLst = new QDirModel( this );
m_pDirModelLst->setSorting(QDir::DirsFirst | QDir::IgnoreCase);

QList< int > lstSize;
lstSize << 350 << 401;
ui.m_pSplitter->setSizes( lstSize );
ui.m_pSplitter->setCollapsible( 0, false );
ui.m_pSplitter->setCollapsible( 1, false );
ui.m_pLst->setModel( m_pDirModelLst );
ui.m_pLst->setRootIndex( m_pDirModelLst->index( qsRememberPath ) );
ui.m_pLst->setSelectionMode( QAbstractItemView::ExtendedSelection );
m_pDirModel->setFilter( QDir::Dirs | QDir::NoDotAndDotDot );

ui.m_pTree->setModel( m_pDirModel );
ui.m_pTree->setCurrentIndex(m_pDirModel->index(qsRememberPath));

ui.m_pTree->hideColumn( 1 );
ui.m_pTree->hideColumn( 2 );
ui.m_pTree->hideColumn( 3 );

QHeaderView *pHeader = ui.m_pTree->header();
pHeader->setVisible( false );

connect( ui.m_pBtnOK, SIGNAL( clicked() ), this, SLOT( OnOK() ) );
connect( ui.m_pBtnCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) );
connect( ui.m_pTree, SIGNAL( clicked ( const QModelIndex ) ), this, SLOT( OnTreeClicked( const QModelIndex ) ) );
}

ESSeUpLoadFileOpenDlg::~ESSeUpLoadFileOpenDlg()
{
if (m_pDirModel)
{
delete m_pDirModel;
}
if (m_pDirModelLst)
{
delete m_pDirModelLst;
}
}

void ESSeUpLoadFileOpenDlg::OnTreeClicked(const QModelIndex &index)
{
QFileInfo info = m_pDirModel->fileInfo( index );
QString qsPath = info.filePath();
ui.m_pLst->setRootIndex( m_pDirModelLst->index( qsPath ) );
}

void ESSeUpLoadFileOpenDlg::OnOK()
{
QModelIndexList lstIndex = ui.m_pLst->GetSelectedIndexes();
QModelIndex index;
QString qsTemp;
m_lstSelectedFile.clear();
for( int i = 0; i < lstIndex.size(); i++ )
{
index = lstIndex.at( i );
QFileInfo info = m_pDirModelLst->fileInfo( index );
if( info.isFile() )
{
qsTemp = info.filePath();
m_lstSelectedFile.append( qsTemp );
}
else if( info.isDir() )
{
qsTemp = info.filePath();
m_lstSelectedDir.append( qsTemp );
}
}
QDialog::accept();
}
void ESSeUpLoadFileOpenDlg::OnCancel()
{
QDialog::reject();
}
中才德创 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dbzhang800 的回复:]
呵呵,你这显然不是真实的代码。别人据此应该无法判断了吧
[/Quote]同感,确实不是真实的代码!据此伪代码,无法查知。
zhenzhouxingxing 2011-02-17
  • 打赏
  • 举报
回复
来人啊,难道这个QDirModel的删除还有什么猫腻不成
zhenzhouxingxing 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dbzhang800 的回复:]
呵呵,你这显然不是真实的代码。别人据此应该无法判断了吧
[/Quote]
但我工程中代码本质上就是做了这些工作,如果将m_pDirModel = new QDirModel( this );注释掉的话就不会有问题
dbzhang800 2011-02-17
  • 打赏
  • 举报
回复
呵呵,你这显然不是真实的代码。别人据此应该无法判断了吧
zhenzhouxingxing 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 renlin0611 的回复:]
ui这个变量是怎么处理的?
[/Quote]
ui还要进行处理吗?只是一个成员变量,对象结束时会自动销毁吧
renlin0611 2011-02-17
  • 打赏
  • 举报
回复
ui这个变量是怎么处理的?

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧