私は、ダイナミックメモリを指すポインタを保持するベクトルを持っているだけでなく、スタック上で宣言された変数のアドレスを保持しているので、動的メモリだけをループスルーして削除する方法があるのでしょうか?または次の安全を実行していますか?コンパイラによっては予期しない結果になるかもしれないと私は考えました。stdベクトルはポインタと可変アドレスを保持します。掃除?
std::vector<int*> theInts;
int* i = new int;
*i = 1;
theInts.push_back(i);
int j = 2;
theInts.push_back(&j);
std::vector<int*>::iterator iIt=theInts.begin();
for(;iIt<theInts.end();iIt++)
delete *iIt;
編集: 私は、次のように安全であるならば、誰かが私に言うことができる一方で、私は共有ポインタに見ながら、生のポインタを使用する事を一時的に変更しましたか?私のプログラムは、今あなたが唯一new
の結果はnullポインタのどちらかだポインタを削除することができます
vector<int*>theInts;
int* anInt = new int;
theInts.push_back(anInt);
if(NULL != anInt)
delete anInt;
anInt = NULL;
vector<int*>::iterator bIt = theInts.begin();
for(;bIt!=theInts.end();bIt++)
{
int* aInt = *bIt;
if(NULL!=aInt)
delete aInt;
aInt=NULL;
}
theInts.clear();
あなたの最善の策は、指し示されたメモリが削除を必要としているかどうかを知っていて、それらのベクトルを格納するかどうかを知るスマートポインタのフォームを作成することです。 – Nick
どういうわけか、ローカル変数と動的に割り当てられたオブジェクトをベクトルに混在させるのは間違いです。あなたはどうやってこの点に来ますか? –
答えが難しいですが、始めに貧弱な計画に落とすことができました。古いソフトウェアをポートフォリオとして最適化しています。私は一つのベクトルを使ってインターフェースエンジンのボタンを踏んでいましたが、いくつかのボタンはcreateButton()で新しく作成され、いくつかはプログラムのどこかで作られました。理想的には、それらはすべてcreateButton()で作成する必要があります。 –