首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

Qt中new和delete有关问题

2013-02-25 
Qt中new和delete问题void MainWindow::gotocell(){GoToCell*dialog new GoToCell(this)if(dialog.exec(

Qt中new和delete问题
void MainWindow::gotocell()
{
    GoToCell*dialog = new GoToCell(this);
    if(dialog.exec())
    {
        QString str = dialog.CellLineEdit->text().toUpper();   
        spreadsheet->setCurrentCell(str.mid(1).toInt()-1,
                                    str[0].unicode()-'A');
    }
    delete dialog;
}

这是参考书上的一段程序。MainWindow是一个对象名称,GoToCell也是一个对象名称,把dialog设置成MainWindow的子对象,为什么还要delete这一步。
[解决办法]
如果不delete,当你关闭dialog时,以后永远无法通过任何方式引用到dialog,然后也就是所谓的“内存泄露了”~
[解决办法]
如果制定了父对象,一般不会导致内存泄漏。

由于是在堆上 delete 会导致 在gotocell方法结束后,内存释放。
如果不使用 delete 会在 MainWindow 释放的时候释放,一般是在程序结束的时候。
[解决办法]
这是参考书上的一段程序。MainWindow是一个对象名称,GoToCell也是一个对象名称,把dialog设置成MainWindow的子对象,为什么还要delete这一步。

MainWindow和GoToCell都是类
dialog才是一个指向GoToCell对象的指针
GoToCell*dialog = new GoToCell(this);
Qt中借鉴了C++内存管理复杂的机制,可以将子对象通过设置parent与另外一个对象关联起来,这样parent不论有多少个子对象,释放的时候,只要delete parent就可以保证对面的子对象会被释放


[解决办法]
这里明显有泄露
只要是new的 没有对应的delete都会泄露
但qt参考了mfc等的设计
为使用者提供了一个简单的方法
如果某个widget创建时 制定了其Parent 则这个widget本身的内存释放将由其Parent widget托管
换言之 子widget即使不显式delete
但显式delete父widget  可以保证其所有的子widget的内存一起被释放

引用:
引用:如果制定了父对象,一般不会导致内存泄漏。

由于是在堆上 delete 会导致 在gotocell方法结束后,内存释放。
如果不使用 delete 会在 MainWindow 释放的时候释放,一般是在程序结束的时候。

是不是说这里既使不用delete也不会造成“内存泄露”

[解决办法]
没有内存泄露,如果你不主动delete,dialog对象会在MainWindow析构的时候被delete,不过既然你已经不会再使用这个dialog对象,使用完后delete能更早的释放这份内存。
引用:
这里明显有泄露
只要是new的 没有对应的delete都会泄露
但qt参考了mfc等的设计
为使用者提供了一个简单的方法
如果某个widget创建时 制定了其Parent 则这个widget本身的内存释放将由其Parent widget托管
换言之 子widget即使不显式delete
但显式delete父widget  可以保证其所有的子widget的内存一……

[解决办法]
引用:
这是参考书上的一段程序。MainWindow是一个对象名称,GoToCell也是一个对象名称,把dialog设置成MainWindow的子对象,为什么还要delete这一步。

MainWindow和GoToCell都是类
dialog才是一个指向GoToCell对象的指针
GoToCell*dialog = new GoToCell(this);
Qt中借鉴了……


3楼说的很好,但却忘了回答最后一个问题:为什么还要delete这一步。我来讲讲,如果不delete的话,等你再次想调用之前的dialog(是void gotocell()方法内的局部变量)时,却是调用不到的,等你再次调用gotocell()方法时,却会发现其实是又new了一个GoToCell(this)对象。delete掉只是为了在此次调用方法gotocell()后销毁它,不让它依附于this所指对象,一旦不delete的话,调用方法gotocell()方法频繁,就会使子对象甚多,之后你懂的....

热点排行