2012-03-15 8 views
0

私は、ダイナミックメモリを指すポインタを保持するベクトルを持っているだけでなく、スタック上で宣言された変数のアドレスを保持しているので、動的メモリだけをループスルーして削除する方法があるのでしょうか?または次の安全を実行していますか?コンパイラによっては予期しない結果になるかもしれないと私は考えました。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(); 
+2

あなたの最善の策は、指し示されたメモリが削除を必要としているかどうかを知っていて、それらのベクトルを格納するかどうかを知るスマートポインタのフォームを作成することです。 – Nick

+0

どういうわけか、ローカル変数と動的に割り当てられたオブジェクトをベクトルに混在させるのは間違いです。あなたはどうやってこの点に来ますか? –

+0

答えが難しいですが、始めに貧弱な計画に落とすことができました。古いソフトウェアをポートフォリオとして最適化しています。私は一つのベクトルを使ってインターフェースエンジンのボタンを踏んでいましたが、いくつかのボタンはcreateButton()で新しく作成され、いくつかはプログラムのどこかで作られました。理想的には、それらはすべてcreateButton()で作成する必要があります。 –

答えて

3

をやっていることのその壊れたバージョン。 &jnewの結果ではなく、NULLポインタではありません。

あなたのコードは安全ではありません。ポインタが自動オブジェクトか動的オブジェクトを指しているかどうかを調べるポータブルな方法はありません。

未処理のポインタではなく、shared_ptrまたはunique_ptrを使用し、スタック変数では、何もしない関数にdeleterを設定することができます。

+0

thatsは考えて、私はベクトルに保持されているオブジェクトのクラスの削除演算子をオーバーライドできると言っているのですか? –

+0

* nitpick:*ヌルポインタを 'delete 'するのは完全に安全です。 ** **§3.7.3.2.3**を確認してください。 [編集:]答えをもう一度読み、多分私はそれを誤解しました。もしあなたがそれをもっとはっきりと明示すればいいのですが、私は言葉の順序によって混乱しました。 –

+0

@westr:クラスの削除演算子のオーバーロードは役に立ちません。 'shared_ptr'のDeleterは別のものです。 –

1

あなたが乱雑なコードを書き込むと、面倒な結果が出ます。あなたは〜と同じように地元の人にポインターを使うことができますが、あなたがしていることを明確にチェックしない限り、あなたは結果に終わります。ここには助けになるかもしれないinteresting article on new() & delete()があります。

関連する問題