0

だからここに私が抱えている問題があります。

std::vector へのポインタがあります。したがって、ポインターを初期化した後は、ベクターにアイテムを追加したり削除したりしません。しかし、私のコードのある時点で、私の std::vector が場所を移動し、ダングリング ポインターになってしまいます。ポインターを作成した後にベクトルに触れたことがないにもかかわらず、これはランダムに発生するようです

この問題を解決するには、これをデバッグするのに時間がかかりました。私の std::vector がメモリの場所を変更しないことを保証する方法はありますか? それとも、ベクトルへのポインターを持つのは悪い考えですか。

4

2 に答える 2

1

それとも、ベクトルへのポインターを持つのは悪い考えですか?

一般に、オブジェクトの有効期間を制御するために生のポインターを使用するのは悪い考えだと思います。生のポインターと自動メモリ管理を使用しないでください。適切な所有権セマンティクス (std::shared_ptr<>またはstd::unique_ptr<>) を持つスマート ポインターを使用してみてください。生のポインターは、ポインターを観察するためだけに使用します (また、ポインターがぶら下がっているかどうかを実行時に確認できるようにする場合は、 を使用しますweak_ptr<>)。

また、多くの場合、ポインターがまったく必要ないことに気付くかもしれません。その場合は、移動セマンティクスのおかげで C++11 で効率的に移動したり、値で渡したり返したりできる自動ストレージを持つオブジェクトを使用するだけです。

于 2013-03-12T18:46:56.140 に答える
1

これはランダムに発生するようです

いいえ、そうではありません。範囲内にある限り、同じアドレスを持ちます。おそらく起こっていることは、ベクトルが範囲外になり、自動的に割り当てられた (ように聞こえる) ため、その時点で破棄されていることです。あなたができることは、ヒープにベクトルを割り当てることです(たとえばintsの場合):

std::vector<int>* pv = new std::vector<int>();

その後、この問題は発生しません。deleteただし、明示的に覚えておく必要があります

delete vp;

beforepvが範囲外になるか、メモリ リークが発生します。

于 2013-03-12T18:47:27.367 に答える