Callback* p = new Callback;
function(p);
내가 콜백 오브젝트를 삭제하려면, 언제, 어떻게 삭제하는 방법?개체를 스스로 삭제할 수 있습니까?
일찍 삭제되면 세그먼트 화 오류로 인해 콜백이 실패 할 수 있습니다.
Callback* p = new Callback;
function(p);
내가 콜백 오브젝트를 삭제하려면, 언제, 어떻게 삭제하는 방법?개체를 스스로 삭제할 수 있습니까?
일찍 삭제되면 세그먼트 화 오류로 인해 콜백이 실패 할 수 있습니다.
스마트 포인터를 사용하는 것이 가장 좋은 해결책입니다.
콜백으로 포인터를 초기화하고 함수에 전달합니다. 함수 또는 어떤 프로세스가 완료되면 콜백은 스마트 포인터에 의해 자동으로 삭제됩니다.
좋은 스마트 포인터 구현은 boost::shared_ptr<>
콜백을 사용할 때의 증가/감소 횟수를 가질 수 있습니다. 사용되면 더 이상 사용하지 않을 때 카운트를 증가시키고 감소시킵니다. 0 또는 -1에 도달하면이를 해제합니다.
콜백 (콜백을 수행하는 콜백) 객체 (콜백을 수행하는 콜러)는 콜백 수명을 결정하는 적절한 소유자 일 수 있으며, 특히 delete
을 사용하여 콜백 객체를 없애고, auto_ptr
등으로 고정). 그 의미가 추가 콜백이 필요하지 않을 때를 결정할 수있는 경우와 같은 경우에만 - 질문에 제공된 것과 같이 부족한 정보로는 알 수 없습니다.
는 또한 가 콜백을 생성 (그리고 발신자 후원자에 대한 소유권을 전달)을 명시 적으로 콜백 개체를 삭제하려면 "호출자 후원자를"요청 (더 이상 콜백을 수행하지 것을 코드에 대한 방법을해야 할 수도 있습니다) 더 이상 콜백이 필요하지 않을 것이라고 결정한 코드 일 때.
다른 답변을 사라 "사람이 소유"에 대한 문제를 만들기 위해 auto_ptr
보다 스마트 포인터를 언급 (부스트의 shared_ptr
, 손으로 압연 참조 횟수는 ...) - 좋을 수는 C를 사용하여 강제하는 경우 ++ 다른 이유로 인해 가비지 수집을 사용하는 언어를 실제로 사용하고 있지만 C++을 선택하면 메모리 사용을 완전히 제어 할 수 있기 때문에 객체 소유권 및 수명 문제를 올바르게 결정할 수 없습니다. 또한 리소스를 심각하게 최적화 할 수 있습니다 사용량은 어느 정도의 자동화 된 "가비지 수집"과 비교할 때 중요합니다. 할 때은 물론 리소스 사용을 면밀히 제어해야합니다. 그 FUNC()를 가정
는 특정 콜백 객체를 사용하는 유일한 기능이며,이 코드는 항상 콜백 객체가 만들어 순서대로 실행되는 것을, 나는()를 호출 FUNC 후 넣어 것입니다. 이렇게하면 func()을 편집해야한다면 콜백 객체가 삭제되는 위치에 대해 걱정할 필요가 없습니다. 또한 func()의 포인터가 함수가 끝나면 멈춰 있어야했기 때문에 모든 포인터가 비워 졌음을 보장합니다. 왼쪽으로 가리키는 포인터는 포인터를 삭제 한 것입니다.
나는 C++의 포인터에 대한 이해가 결함이있는 경우 사과하고 난 항상 그것에 대해 약간 혼란스러워했다, 잘못된 대답을 나에게 발생했습니다. 당신이 실행 FUNC() 후 콜백 포인터에 하나의 참조가 거기에 의미를 넣어 코드가 사소한 경우
, 나는 auto_ptr은 충분할 것으로 판단 :
이std::auto_ptr<Callback> p(new Callback);
func(p.get());
이 또한 정상적으로 보장 func()는 메모리가 해제 될 예외를 던집니다.
"func (p.get())"를 원하셨습니까? – bk1e
예, 감사합니다. –
소유권을 함수에 전달하지 않는 경우. 이것은 어리 석다. 그냥 정상적인 개체를 만들고 포인터를 전달하십시오! 콜백 p; func (&p); –
코드 당신이 쓴 것과 같은 간단한 경우와 func()
직접 어떤 점에서 콜백을 호출,이 충분합니다 :
Callback p;
func(&p);
그러나, func()
가에 대한 참조 또는 포인터를 저장하는 경우 콜백 다른 곳에서는 해당 참조의 수명을 추적해야합니다.
당신에게 달려 있습니다. –