1
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 ? */
4

2 回答 2

4

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

另一方面,调用delete指针NULL是 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 回答