私は、後で別のベクトルに追加するオブジェクトを格納するためにバッファとしてvectorを使用しています。C++ベクトルをバッファとして使用する
バッファを充填して追加するプロセスが繰り返し発生します。したがって、すべての繰り返しでバッファをクリアする必要があります。バッファをクリアするために.eraseまたは.clearメソッドを使用すると、メインベクトルのオブジェクトは削除されます。この仮定は正しいですか? 「はい」の場合、回避策はありますか?
はヴァヒド
私は、後で別のベクトルに追加するオブジェクトを格納するためにバッファとしてvectorを使用しています。C++ベクトルをバッファとして使用する
バッファを充填して追加するプロセスが繰り返し発生します。したがって、すべての繰り返しでバッファをクリアする必要があります。バッファをクリアするために.eraseまたは.clearメソッドを使用すると、メインベクトルのオブジェクトは削除されます。この仮定は正しいですか? 「はい」の場合、回避策はありますか?
はヴァヒド
あなたの懸念が間違っています。
main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end());
コピーmain_vector
にbuffer_vector
からの要素。
これらのコピーされた要素は、元の要素とは完全に分離されているため、コピー元の要素の変更の影響を受けません。
ベクターへの挿入はコピーによって行われます。つまり、要素のコピーを新しいベクトルにプッシュしています。バッファベクトルが消去されると、別のコピーが削除されます。
(これはあなたが第二のベクターへの最初のベクトルのベクトルへの要素へのポインタのようなものを両方のベクターに同じ型を押して、していないことを前提としています。)
ああそう!これはポインタのベクトルです。私は私の質問を更新しています。数分後に読んでください – rahman
要素がポインタであるかどうかにかかわらず、 'vector :: insert'はそれらのコピーを作成するので、操作は安全です。 – Mankarse
ポインタのコピーが作成されます。ポインタを一度だけ削除するようにしてください。あなたの最後のベクトルからポインタを削除する限り、ベクトルはあなたのために*削除*されません、(すべてのポインタがそこに行くと仮定して)うまくいくはずです。ただし、ポインタがスタックに割り当てられた要素を指していて、範囲外になると問題が発生します。 – Corbin
要素をベクターにコピーしていますが、要素を削除するまでそこに残ります。
ポインタかどうかは、コピーされます。 –
あなたが表示するコードでは、オブジェクトにポインタを格納しています。ポインタがコピーされ、元のベクトルがclear
であるか、要素erase
dである場合、割り当てられたメモリに何も起こりません。
実際には、2番目のベクトルが範囲外になった場合、ポイントメモリに何も起こりません!!あなたのプログラムがメモリをリークする場合は、手動でポインタを管理するか、ベクトル内で使用できる適切なスマートポインタを選択する必要があります(C++ 11のstd::unique_ptr
またはstd::shared_ptr
またはboostまたはTR1の同等のものを考慮してください)。
プログラムは、それらのポインタが決して破壊されないオブジェクトを指している場合にのみメモリをリークします。 – Mankarse
@Mankarse:公平な点ですが、メインベクトルのオブジェクトが削除されるかどうかは疑問なので、*私の前提は、ベクトルが範囲外になったときに削除されることを期待していることです。もし彼が期待していれば、私はオブジェクトがフリーストアから割り当てられていて、最初のベクトルを別のものに挿入してから最初のベクトルを.clear()に挿入すると、明示的に 'delete'd –
vector
がどのようにオブジェクトを管理しているのか混同されることがあります。ベクターにpush_back
が入ると、コピーを作成します。 push_back
ポインタを使用すると、ポインタがコピーされます。 clear()
またはerase()
に電話すると、ポインタは削除されますが、オブジェクトは指していません。
Link
オブジェクトをすべてnew
と編集し、vector
コンテナに追加しました。それらを自分で削除する必要があります。コンテナは、(コンテナ自体が破棄されても、範囲外になっても)あなたのためにオブジェクトを指し示すものを破棄しません。すべてのLink
オブジェクトでdelete
を呼び出す前にclear()
両方のコンテナを使用している場合は、メモリリークが発生します(Link
オブジェクトへのポインタを別の場所に保持していないと仮定します)。
コードをフォーマットするには、コードを選択してCtrl-Kキーを押すか、エディタで{}ボタンを押します。 –