0

QSA の参照オブジェクトの削除に問題があります。コンストラクターで、私は書いた:

  QSProject * project = {initialization of QSProject}
  MyWrapper * wrapper = new MyWrapper; // MyWrapper is QObject's child. It comes without parent here
  project->addObject(wrapper);

私は記述子に書いた:

  project->clearObjects();
  delete project;
  delete wrapper;

このコードは、デストラクタの実行時にセグメンテーション違反を引き起こします。まさに、ラッパーを削除しようとしているときです。

私はいくつかの調査を行いましたが、次のことを知っています。

  1. QSProject は「子オブジェクト」を削除しないため、これは「二重削除」の問題ではありません
  2. コンストラクターで QSProject にラッパーを追加しないと、うまく機能します。
  3. 記述子のラッパーを削除しないと、うまく機能します (ただし、メモリ リークが発生します)。

調子はどう?

4

1 に答える 1

0

まず、私は QSA に詳しくありませんが、Qt API が通常どのように機能するかを考えると、QSProject がオブジェクトの所有権を取得している可能性があります。これは、 QSProject がQObject::setParent()を使用してオブジェクトの親を変更していることを意味します。

その場合、オブジェクトを二重に削除しています。

valgrind などのツールを使用して、削除を省略したときに実際にメモリ リークが発生していることを確認しましたか?

于 2011-04-25T16:35:17.720 に答える