2

プロジェクトでは通常のポインターを使用しました。メモリに問題があり、weak_ptr の通常のポインターを変更しました。エラーがありました:

エラー: '->' のベース オペランドに非ポインター型 'boost::weak_ptr' があります</p>

なんで?私は何をすべきか?

4

2 に答える 2

4

std::weak_ptr<T>メモリを維持するために使用したくありません。実際、他の場所で使用されているオブジェクトを取得できるようにしながら、できるだけ早くメモリを解放するために使用されます。所有権のセマンティクスに応じてstd::unique_ptr<T>、オブジェクトの単一の所有者またはオブジェクトstd::shared_ptr<T>の共有所有権に使用します。

アイデアはstd::weak_ptr<T>、オブジェクトが存在する場合はそれらを見つける必要があるかもしれないが、これらのオブジェクトに強く固執したくないということです。つまり、他の所有者、つまりstd::shared_ptr<T>オブジェクトの所有者がいない場合、そのオブジェクトはそれをstd::weak_ptr<T>指していても解放されます。ただし、 は他のstd::weak_ptr<T>オブジェクトが解放されていることを通知されます。が指すオブジェクトを使用するには、それがまだ生きているオブジェクトを実際に指していることを確認しstd::weak_ptr<T>た後、それを に変換する必要があります ( から参照されるオブジェクトが に変換するときにもう存在しない場合)例外がスローされます)。std::shared_ptr<T>std::weak_ptr<T>std::shared_ptr<T>

これらのクラス テンプレートの Boost バージョンにも同じセマンティクスが適用されます。標準のクラス テンプレートは、Boost テンプレートをモデルにしています。

于 2013-08-18T15:11:06.847 に答える