서버의 데이터를 저장/업데이트하기 위해 HTTP 요청을 보내고 있습니다. 요청은 비동기 적으로 이루어지고 완료되면 콜백 함수가 호출됩니다. 모든 경우는 예외적 인 경우를 제외하고는 가끔씩 응용 프로그램이 콜백에서 충돌합니다. 콜백 함수의 개체 삭제
이
내가 뭐하는 거지입니다 : 이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
에서
user = new User();
user->saveOnServer();
user->zombie = true; // Mark the user that it needs to be deleted in the callback.
, 나는 saveOnServer()
방법을 서버에 요청을 보낸 후 새 사용자를 만드십시오.
user = new User();
user->saveOnServer();
user->zombie = true;
// Some code comes here.
if(user)
delete user;
user = new User();
그런 경우에는 이미 삭제 된 콜백으로 사용자를 삭제할 때 응용 프로그램이 충돌합니다. 또 다른 문제는 콜백이 사용자를 삭제하지만 main
에있는 user
포인터가 여전히 일부 주소 (매달린 포인터)를 가리키고 있으므로 다시 삭제하려고한다는 것입니다.
이 경우 메모리를 관리하는 가장 좋은 방법은 무엇인지 모르겠습니다. 나는 zombie
을 가지고 있습니다. 왜냐하면 콜백이 사용자를 삭제하기를 원치 않을 때가 있기 때문입니다.
왜 당신이 서버에 원하는 것 : 콜백에서
을
weak_ptr
것을 사용 클라이언트가 할당 한 객체를 삭제할까? – AJG85서버가 아무 것도 삭제하지 않습니다. 클라이언트는 요청이 끝난 후에 객체를 삭제하기위한 콜백을 가지고 있습니다. – umair
요청 처리가 완료되면 서버에서 콜백을 호출하지 않습니다. 매우 흥미 롭습니다 ... 나는 그 지점으로 뛰어 갈 것입니다. 콜백에 원시 포인터가 있으면 안되며 어디에서나 delete를 호출 할 필요가 없으며 비동기 호출에 소유권이 전달 된 객체를 사용하기 전에 중요한 섹션과 대기 조건이 필요합니다. – AJG85