1

Qt アプリケーションで断続的なセグメンテーション エラーが発生します。この問題は、 の (悪い) 使用に関連していると思いますQSharedPointerQt ドキュメントには次のように記載されています。

QSharedPointer::QSharedPointer ( T * ptr ) : ptr を指す QSharedPointer を作成します。ポインター ptr は、この QSharedPointer によって管理されるようになり、別の QSharedPointer オブジェクトに渡したり、このオブジェクトの外で削除したりしてはなりません

私たちは両方をやっていると思います... :/

QSharedPointerによって管理されているポインターを削除したり、別のポインターに渡したりできないようにする OOP の方法はありQSharedPointerますか?

最善の解決策は、コンパイラ エラーを発生させることです。

4

4 に答える 4

8

通常のパターンはnew、次のようにスマート ポインターのコンストラクター内にステートメントを配置することです。

QSharedPointer<Obj> p (new Obj(2)); 

そうすれば、ネイキッドポインター自体への参照がなくなります。

すべての新しい演算子がこのような行になるようにコードをリファクタリングすると、すべての問題が解決されます。

于 2010-11-11T14:12:30.090 に答える
1

OOP 風の方法は、生のポインターをラッパー クラスのプライベート メンバーとして作成し、共有ポインターで動作するメソッドを介してのみポインターに対してアクションを実行することです。ちょっとばかげていますね。

または、生のポインターを持つクラスを他のクラスの基本クラスにし、生のポインターをクラスのプライベート メンバーにすることもできます。この点で、多かれ少なかれ、何もしない抽象クラスを作成しています。派生クラスは代わりにすべての作業を行う必要があり、生のポインターにアクセスできないため、コンパイルは失敗します...これは、共有ポインターから生のポインター値をコピーすることを誰かが止めるものではありません。

最後に、あなたの最善の方針は、問題のすべての関数を手動で変更して、共有ポインターまたは生のポインターのいずれかを使用することだと思います。ある共有ポインタを別の共有ポインタに安全にコピーできます。

編集:共有ポインタを使用しているかどうかに関係なく、所有権の問題が発生しているようです。ポインターが 1 つのスコープで作成された場合は、ポインターが渡される関数が契約上ポインターの所有権を取得しない限り、そのスコープで削除する必要があります。このシナリオで共有ポインターを使用すると、最終的にはさまざまなバグが発生するだけです。ポインタの共有だけでなく、より深い設計上の問題があるようです。

于 2010-11-11T14:02:02.793 に答える
1

私は共有ポインタの特定の Qt 実装に精通していませんが、一般的なガイドラインとして、未加工のポインタと管理されたポインタを混在させようとすると、通常は血で終わります。動的に割り当てられたデータの所有権を取得する際に共有ポインターの実装を「信頼」したら、オブジェクトの有効期間を自分で管理しようとしないでください (たとえば、提供されたポインターを削除するなど)。

QSharedPointer によって管理されるポインターを削除できないようにする OOP の方法はありますか?

指摘された型にプライベート デストラクタがあり、QSharedPointer をフレンドとして宣言するという奇妙な手法を想像できると思いますが (これにより、「外部削除」がコンパイルされるのを効果的に防ぐことができます)、しかし、これから何か良い結果が得られるとは思えません。 (また、新しく作成して QSharedPointer に転送しない限り、型がまったく使用できなくなることに注意してください)。

QSharedPointer によって管理されるポインターを別の QSharedPointer に渡すことができないようにする OOP の方法はありますか?

これは、所有権が QSharedPointer に転送された後は、生のポインターを操作しないようにする必要があるもう 1 つの理由です。

于 2010-11-11T14:11:44.173 に答える
0

すべての .data() の使用についてコードをチェックし、それらが返すものが保存も削除もされていないことを確認してください。渡されたポインターを保存も削除もしない関数など、生のポインターを渡しても問題ない場合があるため、ハードコンパイラエラーは良くないと思います。(特にサードパーティのコードを使用する場合、共有ポインターを使用するように常にすべてを変更できるとは限りません。多くの場合、未加工のポインターと共有ポインターの両方で動作するようにします)。QSharedPointer::data() を (Qt にパッチを当てて) 非推奨としてマークし、コンパイル時の警告を得ることができます。

于 2010-11-12T13:21:21.530 に答える