2

最近、STL::vector のサイズを増やした後に古いメモリが解放されるかどうかについて混乱が生じました。

挿入により stl::vector の容量が増加すると、新しい連続したメモリが割り当てられ (=2*現在のベクトル容量)、古い内容が新しいメモリにコピーされます。そして、古い記憶が解放されます。

最近、私たちは議論を始めており、古いメモリは解放されず、参照用に保持されていると信じている人もいます。そのため、複数のサイズ変更で stl::vector がメモリを蓄積し始めますが、これは実際には必要ありません。

私の理解では、古いメモリが解放されますが、具体的なドキュメントはありません。しかし、私の理解は間違っているかもしれません!どなたか詳しい方教えていただけると嬉しいです!

4

3 に答える 3

0

N3690から

23.3.7.5 ベクトル修飾子 [vector.modifiers]

iterator insert(const_iterator position, const T& x);

iterator insert(const_iterator の位置、T&& x);

iterator insert(const_iterator position, size_type n, const T& x);

template iterator insert(const_iterator position, InputIterator first, InputIterator last);

iterator insert(const_iterator position, initializer_list);

template void emplace_back(Args&&... args);

テンプレート反復子 emplace(const_iterator position, Args&&... args);

void push_back(const T& x);

void push_back(T&& x);

1 備考: 新しいサイズが古い容量より大きい場合、再割り当てが発生します。再割り当てが発生しない場合、挿入ポイントの前のすべての反復子と参照は有効なままです。T のコピー コンストラクター、ムーブ コンストラクター、代入演算子、ムーブ代入演算子、または任意の InputIterator 操作以外によって例外がスローされた場合、影響はありません。CopyInsertable 以外の T のムーブ コンストラクターによって例外がスローされた場合、その影響は規定されていません。

2 複雑さ: 複雑さは、挿入された要素の数とベクトルの最後までの距離に比例します。

于 2013-08-02T07:41:53.570 に答える
0

おそらくご存じのとおり、再割り当てはvector、標準に従って、 の要素へのすべてのポインタとイテレータを無効にします。古いメモリが何らかの形で保持されている場合、ポインタとイテレータは以前と同じオブジェクトを指すため、引き続き有効です。したがって、標準では、メモリがすぐに解放されることを暗に示しています。

もちろん、これはランタイムがそのメモリをすぐに消去することを強制されるという意味ではありません。実際、製品が顧客のサイトに展開されるまでは、そのままの状態が続く可能性が高くなります。それからそれは彼の顔で爆発します。

于 2013-08-02T07:54:11.500 に答える