2012-03-20 5 views
1

私は、後で別のベクトルに追加するオブジェクトを格納するためにバッファとしてvectorを使用しています。C++ベクトルをバッファとして使用する

バッファを充填して追加するプロセスが繰り返し発生します。したがって、すべての繰り返しでバッファをクリアする必要があります。バッファをクリアするために.eraseまたは.clearメソッドを使用すると、メインベクトルのオブジェクトは削除されます。この仮定は正しいですか? 「はい」の場合、回避策はありますか?

ヴァヒド

+1

コードをフォーマットするには、コードを選択してCtrl-Kキーを押すか、エディタで{}ボタンを押します。 –

答えて

2

あなたの懸念が間違っています。

main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end());コピーmain_vectorbuffer_vectorからの要素。

これらのコピーされた要素は、元の要素とは完全に分離されているため、コピー元の要素の変更の影響を受けません。

1

あなたはmain_vectorの内容をクリアしますbuffer_vectorをクリアする意味場合は、ノー彼らは独立したコピーをありがとう。

+0

これはポインタのベクトルです。私は私の質問を更新しています。数分後にお読みください – rahman

+0

ポインタはまだコピーされます - 古いポインタを削除すると何もしません。コピーされたポインタは同じオブジェクトを指しています。 – adelbertc

1

ベクターへの挿入はコピーによって行われます。つまり、要素のコピーを新しいベクトルにプッシュしています。バッファベクトルが消去されると、別のコピーが削除されます。

(これはあなたが第二のベクターへの最初のベクトルのベクトルへの要素へのポインタのようなものを両方のベクターに同じ型を押して、していないことを前提としています。)

+0

ああそう!これはポインタのベクトルです。私は私の質問を更新しています。数分後に読んでください – rahman

+0

要素がポインタであるかどうかにかかわらず、 'vector :: insert'はそれらのコピーを作成するので、操作は安全です。 – Mankarse

+0

ポインタのコピーが作成されます。ポインタを一度だけ削除するようにしてください。あなたの最後のベクトルからポインタを削除する限り、ベクトルはあなたのために*削除*されません、(すべてのポインタがそこに行くと仮定して)うまくいくはずです。ただし、ポインタがスタックに割り当てられた要素を指していて、範囲外になると問題が発生します。 – Corbin

1

要素をベクターにコピーしていますが、要素を削除するまでそこに残ります。

+0

ポインタかどうかは、コピーされます。 –

1

あなたが表示するコードでは、オブジェクトにポインタを格納しています。ポインタがコピーされ、元のベクトルがclearであるか、要素erase dである場合、割り当てられたメモリに何も起こりません。

実際には、2番目のベクトルが範囲外になった場合、ポイントメモリに何も起こりません!!あなたのプログラムがメモリをリークする場合は、手動でポインタを管理するか、ベクトル内で使用できる適切なスマートポインタを選択する必要があります(C++ 11のstd::unique_ptrまたはstd::shared_ptrまたはboostまたはTR1の同等のものを考慮してください)。

+0

プログラムは、それらのポインタが決して破壊されないオブジェクトを指している場合にのみメモリをリークします。 – Mankarse

+0

@Mankarse:公平な点ですが、メインベクトルのオブジェクトが削除されるかどうかは疑問なので、*私の前提は、ベクトルが範囲外になったときに削除されることを期待していることです。もし彼が期待していれば、私はオブジェクトがフリーストアから割り当てられていて、最初のベクトルを別のものに挿入してから最初のベクトルを.clear()に挿入すると、明示的に 'delete'd –

1

vectorがどのようにオブジェクトを管理しているのか混同されることがあります。ベクターにpush_backが入ると、コピーを作成します。 push_backポインタを使用すると、ポインタがコピーされます。 clear()またはerase()に電話すると、ポインタは削除されますが、オブジェクトは指していません。

Linkオブジェクトをすべてnewと編集し、vectorコンテナに追加しました。それらを自分で削除する必要があります。コンテナは、(コンテナ自体が破棄されても、範囲外になっても)あなたのためにオブジェクトを指し示すものを破棄しません。すべてのLinkオブジェクトでdeleteを呼び出す前にclear()両方のコンテナを使用している場合は、メモリリークが発生します(Linkオブジェクトへのポインタを別の場所に保持していないと仮定します)。

+0

というものはないと仮定します。オブジェクト(私は後でそれらを削除します)メモリリンクの他の兆候があるかもしれません? – rahman

+0

@rahman:配列内のポインタとは別のすべてのオブジェクトへのポインタがある場合は、元のポインタ(コンテナ内にないポインタ)を使用してそれらを削除するとメモリリークが発生しません。ポインタエイリアスのいずれかを介してオブジェクトを削除するとすぐに、そのオブジェクトを指すポインタはすべて無効になります。 – Samaursa

関連する問題