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的内存一起被释放