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

当我两次执行此代码时,就会出现问题。第一次,该函数转到delete(serv)好。第二次,它在调用serv->running()之前和serv != NULL之后导致分段错误。
我不明白为什么第二次执行进入第一个if语句。以下内容是否会导致myObject = NULL是不是真的?
Class* myObject = new Class();
/***/
delete(myObject); /* myObject = NULL ? */

最佳答案

不,那不是真的。delete没有将指针设置为NULL。它仅释放分配给指针的内存,并调用适当的析构函数。

另一方面,在delete指针上调用NULL是No-Op。因此,不需要在调用NULL之前检查delete

请注意,在NULL之后显式使用delete指针似乎可以解决您的问题,但可能会在代码中隐藏问题。解决此问题的最佳方法是使用Smart指针而不是需要显式内存管理的原始指针。

07-24 14:27