0

この分野の既存の質問/回答はそれぞれ微妙に異なっているようです。

イテレータを使用してshared_ptr<vector<Point>> profileループする があります。shared_ptr<Point>さまざまな目的でループの外側を保持したいのですが、構文に苦労しています。教えてください。

以下に基本的な例を示します。

shared_ptr<Point> peak;
for (vector<Point>::iterator point=profile->begin(); point!=profile->end(); point++)
{
    ...
    peak = shared_ptr<Point>(*point); // fails
    ...
}

NBへのプレーンな参照/ポインターを使用するのPointは簡単だと思いますが、特にヒープが関係している場合は、これを避けようとしています。この場合、インデックスを使用できることも認識していますが、これはコンテナー クラス間での転送が難しくなります。

4

2 に答える 2

3

あなたが必要とするのはshared_ptr<vector<shared_ptr<Point>>>、あなたが安全に周りを通過したい場合shared_ptr<Point>です

問題はshared_ptr<vector<Point>>、範囲外になるとshared_ptr<Point>、のメンバーから構築されたvectorものが無効なメモリを指していることです。

反対に、新しく作成shared_ptr<Point>したものが範囲外になった場合、 によって管理されているメモリの割り当てを解除しようとすることになりますが、vectorこれは良いことではありません!

于 2013-03-18T14:34:03.770 に答える
2

*pointありPointませんPoint*

しかし、( 経由で) そのアドレスを取得したとしても、オブジェクトの有効期間には自動ストレージが&*pointあるため、 を作成できませんでした。shared_ptrshared_ptr

元のベクトルが変更されない限り、内部のオブジェクトへの参照 (または生のポインター) を取得しPointても安全です。ただし、ベクトルを変更すると、その要素が移動し、それらへの参照が無効になる場合があります。

最後に、なぜベクトルが でラップされているのか疑問に思っていますshared_ptr。それが意味をなすことはめったにありません。本当にこれが必要ですか?

于 2013-03-18T14:34:00.990 に答える