4

小さなユーティリティアプリケーションをより新しいC++方式に更新しようとしていますが、std :: shared_ptrでいくつかのQtオブジェクト、特にコンストラクター引数として他のQWidgetを受け取るオブジェクトの使用に問題があります。

例えば:

private:
    std::shared_ptr<QWidget> centralwidget;
    std::shared_ptr<QVBoxLayout> verticalLayout;

public:
    void setupUi(QMainWindow *MainWindow) // this pointer is a .get() from a shared_ptr
    {
        centralwidget = std::make_shared<QWidget>(new QWidget(MainWindow)); // compiles fine
        verticalLayout = std::make_shared<QVBoxLayout>(new QVBoxLayout(centralwidget.get())); // does not compile
    }

コンパイルエラーは次のとおりです。

エラー1エラーC2664:'QVBoxLayout :: QVBoxLayout(QWidget *)':パラメーター1を'QVBoxLayout*'から'QWidget *'に変換できませんe:\ microsoft visual studio 11.0 \ vc \ include \ memory 855

このエラーを理解できないようです。何も変換していません。QVBoxLayoutオブジェクトを作成し、その親としてQWidgetを渡そうとしています(生のポインターの場合と同じように)。

4

2 に答える 2

14

Qtはすでに独自のメモリ管理メカニズムを提供しているため、一般的に、QtGUIオブジェクトにshared_ptrを使用することは避けようとしています。各QObjectには親がある可能性があり、この親が死ぬと、すべての子が削除されます。ここではshared_pointerは不要であり、付加価値はありません。メモリリークを発生させることなく、rawポインタを完全に使用できます。

一般的に、最後のshared_ptrインスタンスが削除される前にQObjectの親が停止すると、最後のshared_ptrが破棄されるときにオブジェクトが再度削除されるため、すぐに問題が発生します。ここではそうではありませんが、注意してください:)

于 2012-06-09T19:06:28.200 に答える
5

の引数std::make_sharedは、インスタンス化するクラスのコンストラクターに渡されます。つまり、基本的にあなたがしていることは以下と同等です:

new QVBoxLayout(new QVBoxLayout(centralwidget.get()))

私はあなたがやろうとしていることは:

centralwidget = std::make_shared<QWidget>(MainWindow);
verticalLayout = std::make_shared<QVBoxLayout>(centralwidget.get());

のドキュメントをご覧くださいstd::make_shared(たとえば、こちら)。この関数の要点は、メモリ内のオブジェクトインスタンスの近くに参照カウントを割り当てることです。そのため、割り当てを自動的に行う必要があります。

于 2012-06-09T18:08:39.140 に答える