C ++删除分段错误

时间:2012-10-24 03:30:20

标签: c++ segmentation-fault

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

删除serv后需要设置为NULL。不是局部变量,而是由Program()::getServer()返回的变量。

假设有Program()::setServer

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

重用已删除的指针是崩溃的秘诀。 删除指针不会将其设置为NULL