2016-12-14 12 views
1

私の英語は申し訳ありません。私は同じコードを持っている:ポインタの代わりにスマートポインタ

auto windowsStack = m_windowManger->windowsStack(); 

auto ListModel = new QStandardItemModel(); 

while(!windowsStack.empty()) 
{ 
    auto window = windowsStack.top(); 
    auto title = QString::fromUtf8(window->title().c_str()); 

    auto Items = new QStandardItem(title); 
    ListModel->appendRow(Items); 

    windowsStack.pop(); 
} 

ui->listView->setModel(ListModel); 

すべてが正常に動作し、私の仕事は、スマートポインタへのポインタを交換することです。私は、何度も私の決定にそれをやった:

auto windowsStack = m_windowManger->windowsStack(); 

auto ListModel = std::shared_ptr<QStandardItemModel>(); 

while(!windowsStack.empty()) 
{ 
    auto window = std::shared_ptr<Window>(windowsStack.top()); 
    auto title = QString::fromUtf8(window->title().c_str()); 

    auto Items = std::shared_ptr<QStandardItem>(new QStandardItem(title)); 
    ListModel->appendRow(Items.get()); 

    windowsStack.pop(); 
} 

ui->listView->setModel(ListModel.get()); 

をしかし、最終的には、私がメッセージを取得:プログラムが予期せず終了しました。

ListModel->appendRow(Items.get()); 

新バージョン:プロンプトで、このラインで

auto ListModel = std::make_shared<QStandardItemModel>(); 
while(!windowsStack.empty()) 
{ 
    auto window = windowsStack.top(); 
    windowsStack.pop(); 
    auto title = QString::fromUtf8(window->title().c_str()); 
    ListModel->appendRow(new QStandardItem(title)); 
} 

ui->listView->setModel(ListModel.get()); 

答えて

3

ここにいくつかの問題があります。コメントやエドガーRokyansの答えで指摘したように最初は、あなたがmake_shared

auto ListModel = std::make_shared<QStandardItemModel>(); 

より不吉なエラーでアイテムを割り当てることによって、それが最初に固定されているnullにshared_ptrとしてListModelを作成すること、であることは、あなたが作成しているということですループ内の要素を返し、ListModelへの所有していないポインタを渡し、Itemsのデストラクタが実行されたときにループの最後に無効になります。 QStandardItemModeldefined to delete the items it hasなので、それらを渡す前にshared_ptrを使用して項目を割り当てるべきではありません。代わりにappendRowを割り当てて呼び出してください。さらにshared_ptrwindowsStackから得るものをラッピングしていますが、windowsStackは所有するポインタのスタックのコピーのようです。これは奇妙なことです。私は確信が持てませんが、実際にここで生ポインタを使用するか、windowsStackshared_ptrのスタックにするかのように見えます。私はwindowsStack()が何を返すのかわからないので、実際にはわかりません。それは、呼び出し元が削除するはずの動的に割り当てられたメモリへの生ポインタを持つスタックかもしれません。

while(!windowsStack.empty()) { 
    auto window = windowsStack.top(); 
    windowsStack.pop(); 
    auto title = QString::fromUtf8(window->title().c_str()); 
    ListModel->appendRow(new QStandardItem(title)); 
} 
+0

ありがとうございました。エラーはなくなりましたが、QListViewは何も追加されていません。それは裸のポインタで動作しますが。 –

+1

あなたはまだ最後の行 'ui-> listView-> setModel(ListModel.get());)が必要です。'傷ついたループを書き直していただけです。 –

+0

私は最後の行を削除しませんでした。それが起こりました。上の質問に新しいバージョンを追加しました。 何もqlistviewに追加されませんでした。 –

3
auto ListModel = std::shared_ptr<QStandardItemModel>(); 

あなたは、空の共有ポインタListModelを作成します。

することで交換してみてください。

auto ListModel = std::shared_ptr<QStandardItemModel>(new QStandardItemModel()); 

ライアンは私が指摘したように、コードの量を削減し、冗長メモリ割り当てを避けるために役立つ、std::make_sharedを使用することをお勧めします:

auto ListModel = std::make_shared<QStandardItemModel>(); 

注:

私はちょうど1つの間違いを記述しました。あなたのコードに他の問題があるようです。詳細についてはライアンの答えを確認してください。

関連する問題