Qt中new和delete有关问题
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,dialog对象会在MainWindow析构的时候被delete,不过既然你已经不会再使用这个dialog对象,使用完后delete能更早的释放这份内存。
------解决方案--------------------
3楼说的很好,但却忘了回答最后一个问题:为什么还要delete这一步。我来讲讲,如果不delete的话,等你再次想调用之前的dialog(是void gotocell()方法内的局部变量)时,却是调用不到的,等你再次调用gotocell()方法时,却会发现其实是又new了一个GoToCell(this)对象。delete掉只是为了在此次调用方法gotocell()后销毁它,不让它依附于this所指对象,一旦不delete的话,调用方法gotocell()方法频繁,就会使子对象甚多,之后你懂的....
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,dialog对象会在MainWindow析构的时候被delete,不过既然你已经不会再使用这个dialog对象,使用完后delete能更早的释放这份内存。
------解决方案--------------------
3楼说的很好,但却忘了回答最后一个问题:为什么还要delete这一步。我来讲讲,如果不delete的话,等你再次想调用之前的dialog(是void gotocell()方法内的局部变量)时,却是调用不到的,等你再次调用gotocell()方法时,却会发现其实是又new了一个GoToCell(this)对象。delete掉只是为了在此次调用方法gotocell()后销毁它,不让它依附于this所指对象,一旦不delete的话,调用方法gotocell()方法频繁,就会使子对象甚多,之后你懂的....