2012-10-24 54 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 = NULLC++刪除段錯誤

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

回答

4

不,這是不正確的。
delete不會將指針設置爲NULL。它只是釋放分配給指針的內存並調用適當的析構函數。

另一方面,在NULL上調用delete指針是無操作。因此在致電delete之前不需要檢查NULL

注意delete後明確NULL荷蘭國際集團的指針似乎應解決您的問題,但它可能會隱藏在解決這個你code.The最好的方法問題,是使用智能指針,哪些需要明確的內存管理不生指針。

1

刪除後serv需要設置爲NULL。不是局部變量,而是由Program()::getServer()返回的那個。

假設有一個Program()::setServer

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

重用已刪除的指針爲崩潰配方。 並且刪除指針不會將其設置爲NULL