以下代码会崩溃,我发现它与“new []”
有关MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QPushButton *buttons = new QPushButton[5];
for(int i=0;i<5;++i){
buttons[i].setGeometry(0,0,30,40);
buttons[i].setParent(this);
}
}
将new []更改为普通数组后,它可以正常工作
#mainwindow.h
QPushButton buttons[5];
#mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i=0;i<5;++i){
buttons[i].setGeometry(0,0,30,40);
buttons[i].setParent(this);
}
}
任何想法?感谢
答案 0 :(得分:1)
任何想法?
我怀疑 QPushButton 正在重载运算符new [] ,并且该运算符中的某些内容不太正确。
由于这个运算符new [] ,您看到静态和已分配对象之间存在差异。
要明白我的意思,请考虑以下代码:
#include <stdio.h>
class QPushButton
{
public:
QPushButton() {
printf("Constructor\n");
}
void *operator new[](size_t size) {
printf("New operator overloaded.\n");
return new char[size];
}
};
int main(int argc, char *argv[])
{
argc;argv;
printf("Stack defined objects\n");
QPushButton button[5];
printf("Allocated objects\n");
QPushButton *p = new QPushButton[5];
delete [] p;
return 1;
}
以及结果输出:
C:\TEMP>test
Stack defined objects
Constructor
Constructor
Constructor
Constructor
Constructor
Allocated objects
New operator overloaded.
Constructor
Constructor
Constructor
Constructor
Constructor
从上面的输出可以看出,new运算符会在本地和已分配的对象之间创建差异。
答案 1 :(得分:1)
我没有Qt专家,但据我所知,QObject
假定其所有子对象的所有权(它在析构函数中delete
)。
如果是这种情况,您不应该做任何您正在做的事情 - 每个QPushButton
应该动态分配 和使用new
单独,以及您的第二个示例没有崩溃这一事实很奇怪。