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

私は Qt の専門家ではありませんが、私が知る限り、aQObjectはすべての子オブジェクトの所有権を前提としています (deleteそれらはデストラクタにあります)。

その場合、あなたがやっているこれらのことを行うことは想定されていません.すべてを動的かつ個別に使用してQPushButton割り当てる必要があり、2番目の例がクラッシュしないという事実は奇妙なことです.new

于 2012-07-11T14:32:03.897 に答える
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 に答える