在qt中使用new []时出现奇怪的崩溃

时间:2012-07-11 04:45:32

标签: c++ qt

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

}

任何想法?感谢

2 个答案:

答案 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单独,以及您的第二个示例没有崩溃这一事实很奇怪。