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 ? */
答案 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
。