2012-10-24 3 views
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이 발생한다는 것은 사실이 아닙니까?C++ 삭제 분할 오류

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

답변

4

아니요, 사실이 아닙니다.
delete 포인터를 NULL으로 설정하지 않았습니다. 단순히 포인터에 할당 된 메모리를 할당 해제하고 적절한 소멸자를 호출합니다.

반면에 NULL 포인터에서 delete을 호출하면 No-Op입니다. 따라서 delete으로 전화하기 전에 NULL을 확인할 필요가 없습니다.

delete 뒤에 포인터를 명시 적으로 지정하면 문제가 해결되지만 코드에서 문제를 숨길 수 있습니다.이 문제를 해결하는 가장 좋은 방법은 명시 적 메모리 관리가 필요한 원시 포인터가 아닌 스마트 포인터를 사용하는 것입니다.

1

serv을 삭제 한 후 NULL으로 설정해야합니다. 지역 변수가 아니라 Program()::getServer()에 의해 반환되는 변수입니다.

은 가정 삭제 된 포인터가 충돌에 대한 제조법 재사용 Program()::setServer

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

있다. 포인터를 삭제해도 NULL으로 설정되지 않습니다.