9

メイン ウィジェットをスタックまたはヒープのどちらで初期化するかについて、少し混乱しています。「QT 4 を使用した C++ GUI プログラミング」では、メイン ウィジェットはスタック上で初期化されます。詳細を説明する前に、私が何を意味するかを説明します。

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWin;
    mainWin.show();
    return app.exec();
}

おそらく、これは単に安全であるからであり、QT でのメモリ割り当てについて読者を混乱させたくないからでしょう。QObject から継承するオブジェクトの削除を除外すると、読者は QT オブジェクトによるメモリ管理を「忘れる」ことができます。しかし、私の質問は、その方法を好むべきか、それとも次の方法を好むべきかということです。

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow* mainWin = new MainWindow;
    mainWin->show();
    int execReturn = app.exec();
    delete mainWin;
    return execReturn;
}

この質問をする主な理由は、通常、ヒープとスタックを選択するパターンに従うことを好むからです。

  • アイテムが大きい場合 -ヒープ
  • アイテムが長期の場合 -ヒープ
  • それ以外 -スタック

さて、私の質問は 2 つの質問に集約されると思います。

  • QWidget は、スタック オーバーフローを恐れるほど大きいですか?
  • 平均的なアプリケーションのスタックの大きさは? スタックのオーバーフローをいつ恐れるべきですか (明らかに再帰関数以外)?

QWidget 自体がスタック オーバーフローを引き起こす可能性は低いと認識していますが、もちろん、これは私のアプリケーションで発生する可能性のある他のスタック使用量の上にあります。

4

2 に答える 2

4

ヒープとスタックを選択するパターンは合理的に聞こえますが、オブジェクトのサイズについてはあまり心配しません。大きなオブジェクトは、ヒープを内部的に使用する必要があります。std::vector は通常、3 つのポインターのサイズですが、非常に大きくなる可能性があります。

オブジェクトがそれだけでスタックをオーバーフローするほど大きいことを恐れる必要はないと思います。可能性はありますが、確かに非常にまれです (私は見たことがありません)。

シンプルさについても考えることをお勧めします。ヒープに任意のローカル変数を割り当てて、関数が戻る前に解放することもできますが、これは不必要に複雑になり、一般的に悪い習慣と見なされます。

スタック サイズは、通常、リンカー設定によって構成されます。Windows では、デフォルトで 1MB です。

于 2011-12-31T16:02:10.150 に答える
2

短いコードを提供するだけなので、スタックベースのアプローチを使用することを好みます。スタック オーバーフローに関する懸念はもっともですが、発生する可能性はほとんどありません。

QApplicationとのサイズについてはわかりませんがMainWindow、巨大なサイズを必要とする内部データ構造には (ほとんどの場合) ヒープが使用されます。したがって、潜在的なスタック オーバーフローについてそれほど心配する必要はありません。

通常、Windows アプリケーションのスタック サイズは 1MB です。ただし、リンカー オプションを変更することで簡単に変更できます: /STACK

于 2011-12-31T15:59:33.750 に答える