1
void EventCloseServer::act(){
    Server* serv = Program()::getServer();
    if (serv != NULL) {
        if (serv->running()) {
            serv->stop();
            serv->sync();
        }
        delete (serv);
    }
}

このコードを 2 回実行すると問題が発生します。初めて、関数はdelete(serv)うまくいきます。serv->running()2 回目は、 の呼び出しの前後でセグメンテーション違反が発生しserv != NULLます。if2 番目の実行が最初のステートメント内に入る理由がわかりません。次の結果になるのは本当ではありませんmyObject = NULLか?

Class* myObject = new Class();
/***/
delete(myObject); /* myObject = NULL ? */
4

2 に答える 2

4

いいえ、そうではありません。
deleteへのポインタを設定しませんNULL。ポインタに割り当てられたメモリの割り当てを解除し、適切なデストラクタを呼び出すだけです。

一方deleteNULLポインターの呼び出しは No-Op です。NULLしたがって、を呼び出す前にチェックする必要はありませんdelete

NULLポインターを明示的に使用すると問題deleteが解決するように見えますが、コードに問題が隠れている可能性があることに注意してください。これを解決する最善の方法は、明示的なメモリ管理が必要な生のポインターではなく、スマート ポインターを使用することです。

于 2012-10-24T03:32:14.137 に答える
1

削除後serv、 に設定する必要がありますNULL。ローカル変数ではなく、 によって返される変数ですProgram()::getServer()

があると仮定するとProgram()::setServer

delete(serv);
Program()::setServer(NULL);

削除されたポインターを再利用すると、クラッシュの原因になります。また、ポインターを削除しても、ポインターは に設定されませんNULL

于 2012-10-24T03:34:55.270 に答える