1

以下代码会崩溃,我发现它与“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);
    }

}

有任何想法吗?谢谢

4

2 回答 2

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 运算符在本地对象和分配的对象之间产生了差异。

于 2012-07-11T05:26:42.297 回答
1

我不是 Qt 专家,但据我所知, aQObject假定拥有它的所有子对象(它delete在析构函数中)。

如果是这种情况,您不应该做任何您正在做的事情 - 每件事都QPushButton应该使用 动态和单独分配,new第二个示例不会崩溃的事实很奇怪。

于 2012-07-11T14:32:03.897 回答