我正在發送一個HTTP請求來保存/更新服務器上的數據。該請求是異步完成的,並在完成時調用回調函數。一切正常,除了有時候,應用程序在回調中崩潰。刪除回調函數中的對象
這是我在做什麼:
user = new User();
user->saveOnServer();
user->zombie = true; // Mark the user that it needs to be deleted in the callback.
在User
,我有一個saveOnServer()
方法:
void User::saveOnServer(){
Request *request = new Request();
// Send request to the server and register the callback.
request ->setCallback(&userCallback, (void*)this);
}
回調:
void userCallback(void *data){
User *user = (User*)data;
// Do something here.
// Delete user if it's a zombie.
if(user->zombie)
delete user;
}
有時候,我需要在向服務器發送請求後創建一個新用戶:
user = new User();
user->saveOnServer();
user->zombie = true;
// Some code comes here.
if(user)
delete user;
user = new User();
問題是,在這種情況下,應用程序在刪除回調中的用戶時會崩潰,因爲它已被刪除。另一個問題是,回調刪除用戶,但main
指針user
仍然指向某個地址(懸掛指針),所以我再次嘗試刪除它。
我不確定在這種情況下管理內存的最佳方式是什麼。我有zombie
,因爲有些情況下我不希望回調刪除用戶。
爲什麼你會想要一臺服務器刪除我想知道的客戶端分配的對象? – AJG85
服務器不刪除任何內容。客戶端在請求結束後有一個回調來刪除對象。 – umair
當處理請求完成時,服務器不會調用回調嗎?非常有趣...我只是想跳到這一點。在回調中不應該有原始指針,應該不需要在任何地方調用delete,並且在使用所有權已傳遞給異步調用的對象之前,需要臨界區和等待條件。 – AJG85