サーバー上のデータを保存/更新するために 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();
問題は、このような場合、コールバックでユーザーを削除すると、ユーザーが既に削除されているため、アプリケーションがクラッシュすることです。もう 1 つの問題は、コールバックがユーザーを削除することですが、user
ポインターmain
はまだ何らかのアドレス (ダングリング ポインター) を指しているため、再度削除を試みます。
この場合、メモリを管理する最善の方法が何であるかはわかりません。コールバックでユーザーを削除したくzombie
ない場合があるため、配置しました。