5

C++ のメモリ部分を理解しようとしています。以下のコードを使用して出力を生成した後、メモリを解放しようとしています。

質問:

if文を使ってメモリを解放する必要はありますか?

コード:

int main(){
    char *pc;
    int *pi;

    pc = new char('a');
    pi = new int(8);

    cout << *pc << endl;
    cout << *pi << endl;

    //What's the purpose for doing if(pc) and if (pi) below?

    if(pc){
        delete pc;
    }
    if(pi){
        delete pi;
    }

return 0;
}

私はこのようにすることができますか?int main(){ char *pc; int *pi;

    pc = new char('a');
    pi = new int(8);

    cout << *pc << endl;
    cout << *pi << endl;


    delete pc;
    delete pi;

return 0;
}
4

3 に答える 3

9

メモリ解放時に IF 文を使用する必要はありますか?

いいえ、そうではありません ( global をオーバーライドしていない限りoperator delete)。これはまったく問題なく、何もしません。

int* p = nullptr;
delete p;

C++11 標準のパラグラフ 3.7.4/2 によると:

[...] 割り当て解除関数に提供される最初の引数の値は、NULL ポインター値である可能性があります。その場合、および割り当て解除関数が標準ライブラリで提供されているものである場合、呼び出しは効果がありません。[...]

ただし、コメントで chris が示唆しているようnewに、未加工のポインター、およびdelete(または対応する配列)を使用して手動でメモリ管理を実行するのではなく、スマート ポインターを使用することを検討してください。

于 2013-05-16T22:46:46.813 に答える
3

特定のコードでは、null チェックは必要ありません。

delete (T*)0;一般に、 type の割り当て解除関数を呼び出すかどうかは実装固有Tです。実装が割り当て解除関数に null ポインターを渡し、型が member を提供することによって割り当て解除関数をオーバーライドしたかoperator delete、代わりの global が提供され、::operator deleteそのカスタム割り当て解除関数が null ポインター値を適切に処理しない場合は、次のことができます。問題があります。

標準ではoperator delete、null ポインターが渡されたときにカスタムが何もしないことを要求していません。失敗する べきではありませんが、たとえば、厄介なログ メッセージを書き込んだり、誰かがコーディング標準に従っていないことを上司に伝えたりする可能性があります。

于 2013-05-16T22:54:03.043 に答える
-1

いいえ、そうではありませんが、そうすることは良い習慣と考えられています。実際のシナリオでは、ビジネス要件やバグなどによりコードが頻繁に変更されるため、この種の防御的なプログラミング戦略を使用することが常に最善です。

あなたが望む最後のことは、同僚がコードの上部を変更したために、すでに解放されたポインターを解放するために検出しにくいエラーが発生することです

于 2013-05-16T22:49:28.773 に答える