0

ポインターのスタックのクリーニングにいくつか問題があります。以下の削除クラッシュのある行:「メモリ障害/セグメンテーション障害」。

std::stack<reports*> stack;
while(db.fetch())
{
    reports* report = new report(db);
    QThreadPool::globalInstance()->start(report);
    stack.push(report);
}
while( QThreadPool::globalInstance()->activateThreadCount() != 0 );

while( !stack.empty() )
{
    delete stack.top();
    stack.pop();
}

このコードのコンテキストは関係ないと思います。ただし、db は参照によってレポート コンストラクターに渡されます。レポート コンストラクターは、必要な現在の行データを非ポインター メンバーとして直ちにコピーします。誰かが私にヒントを与えることができますか?

編集:

自己回答:

わかりました、質問を書いた直後に神の光に触れました。

デフォルトで

QThreadPool::globalInstance()->start(report);

オブジェクトの所有権を取得します。ループに次の行を追加すると、問題が解決します。

report->setAutoDelete(false);

または、単純にクリーンアップせずに...自分でQtに任せてください。

4

3 に答える 3

1

わかりました、質問を書いた直後に神の光に触れました。

デフォルトで

QThreadPool::globalInstance()->start(report);

オブジェクトの所有権を取得します。ループに次の行を追加すると、問題が解決します。

report->setAutoDelete(false);

または、単純にクリーンアップせずに...自分でQtに任せてください。

于 2013-08-08T08:45:54.980 に答える
0

明示的なメモリの拡大を回避し、問題を解決するには、次の 2 つの方法があります。

  • スマート ポインターを使用します。
  • 参照を使用します。スタックの場合、STL コンテナーの要件の 1 つは、要素がコピー可能でなければならないことです。std::refで参照をラップするこの問題を解決できます。

この場合、 std::shared_ptrを使用するのが最善の方法だと思います。

于 2013-08-08T08:46:21.150 に答える
-1

レポート クラスを確認する必要があると思います。スタックを適切に処理していることは明らかなので、削除しようとすると問題はレポート (スタックの一番上) にあるはずです。

レポートのデストラクタを確認/作成します。そこでも処理できるものがあるはずです

于 2013-08-08T08:47:18.830 に答える