0

こんにちは、QList をパラメーターとして別のクラスに送信しようとしていますが、何らかの理由で読み取りアクセス違反が発生しました...

CompareTimeChannel.h

 class CompareTimeChannel : public IDataChannel
   public:

      // @brief The method used to receive the list
      void setData(const QList< QSharedPointer<core::ITrackSection> > & sections);

      // @brief The list
      QList< QSharedPointer<core::ITrackSection> > _sections;

 };

CompareTimeChannel.cpp

 // @brief Empty constructor
 CompareTimeChannel::CompareTimeChannel()
 {
 }

 void CompareTimeChannel::setData(const QList< QSharedPointer<core::ITrackSection> > & sections)
 {
     //_sections = *new QList< QSharedPointer<core::ITrackSection> > ();
     _sections.clear();
     _sections.append(sections);
 }

このコードを実行すると、スローException at 0x31cc78d, code: 0xc0000005: read access violation at: 0x4, flags=0x0されます_sections.clear();

前にリストを初期化しようとしましたが (コメント行_sections = *new QList<...>)、例外は同じようにスローされます。

答えは非常に高く評価されます...

編集

よし、直った!

まず、@AndreasT が言ったように、デフォルトの QList コンストラクターを初期化する必要がありました。

次に、@ 10WaRRioR01 の回答によるとCompareTimeChannel、メソッドが最初に呼び出されたときに初期化されなかったことが問題の原因です。を使用して修正:

        CompareTimeChannel* chan = static_cast<CompareTimeChannel*>(channel);
        Q_ASSERT(chan);
        if (chan) {
            chan->setData(sections);
        }
        else {
            qDebug() << "Dynamic cast failure";
        }

みんなありがとう!

4

3 に答える 3

0
//_sections = *new QList< QSharedPointer<core::ITrackSection> > ();

このようなことをしてはいけません。これにより、ヒープ上にQListの新しいインスタンスが作成され、削除されることはないため、メモリリークが発生し
ます。

_sections = QList< QSharedPointer<core::ITrackSection> > ();

代わりに、それは合法です。しかし、最も簡単な方法は、このようなコピー割り当てを使用することです

_sections = sections

発生した問題は、_sectionsにあるデータに関連している可能性があります。nullのCompareTimeChannelオブジェクトでメソッドを呼び出している可能性があります

于 2013-03-06T13:51:05.273 に答える
0

コンストラクターでセクションを初期化する必要があります。コメント行はひどく間違っています。

newヒープ上に List を構築し、それを with で逆参照する*newと、代入によって Heap 上の新しいリストのコピー コンストラクターが暗黙的に呼び出され、それがインスタンスにコピーされます。ただし、ヒープ上のものはまだ残っているため、メモリ リークが発生しました。

// @brief Empty constructor
 CompareTimeChannel::CompareTimeChannel()
:_sections()   // initialization default constructor.
 {
 }

コメントに関する編集:

QList.clear() メソッドは、リストのすべての要素のデストラクタを呼び出します。共有ポインタの少なくとも 1 つが正しく初期化されていないようです。さらに情報が必要な場合は、_sections に何かを入れるコードを貼り付けてください。

編集例外について: 私が言ったように、問題は共有ポインタが興味深いものに設定されていない可能性が最も高いです。SP が破棄されると、存在する必要があるコンテンツのデストラクタが呼び出されます。そうでない場合は、症状を説明する読み取りアクセス違反がスローされます。

于 2013-03-06T13:44:04.720 に答える
0

あなたが示したこれはうまくいくはずです。あなたの問題は他の場所にあります。
この種の問題は、さまざまな間違いによって引き起こされる可能性があります。static_castたとえば、C スタイル キャストの不適切または不適切な使用、動的ライブラリを使用している場合のバイナリ互換性の破れ、テーブル外への書き込み、コンパイラ キャッシュの問題 (これは非常に頻繁に発生するため、解決策です)。それは以下です)。

最初に私がやろうとしていること:

make clean
qmake
make

これにより、このような問題が頻繁に修正されます。役に立たない場合は、コード内の他の問題を見つける必要があります。

于 2013-03-06T14:27:07.273 に答える