2009-06-19 4 views
3
Callback* p = new Callback; 
function(p); 

내가 콜백 오브젝트를 삭제하려면, 언제, 어떻게 삭제하는 방법?개체를 스스로 삭제할 수 있습니까?

일찍 삭제되면 세그먼트 화 오류로 인해 콜백이 실패 할 수 있습니다.

+0

당신에게 달려 있습니다. –

답변

17

스마트 포인터를 사용하는 것이 가장 좋은 해결책입니다.
콜백으로 포인터를 초기화하고 함수에 전달합니다. 함수 또는 어떤 프로세스가 완료되면 콜백은 스마트 포인터에 의해 자동으로 삭제됩니다.
좋은 스마트 포인터 구현은 boost::shared_ptr<>

+0

공유 포인터가 필요하면 컴파일러가 제공하는 tr1 :: shared_ptr implmentation을 사용하십시오 (현대적이라고 가정). 그렇지 않으면 RAII에 boost :: scoped_ptr을 오버 헤드없이 사용하십시오. – Patrick

+0

이 상황에서는 std :: auto_ptr이 더 나은 스마트 포인터입니다. 그런 다음 콜백 객체의 소유권을 함수에 전달합니다. –

+0

우리는이 콜백이 어디로 가고 있는지 전혀 알지 못하기 때문에 이들 중 어느 것도 안전하게 제안 할 수 없다고 말할 것입니다. – shoosh

1

콜백을 사용할 때의 증가/감소 횟수를 가질 수 있습니다. 사용되면 더 이상 사용하지 않을 때 카운트를 증가시키고 감소시킵니다. 0 또는 -1에 도달하면이를 해제합니다.

1

콜백 (콜백을 수행하는 콜백) 객체 (콜백을 수행하는 콜러)는 콜백 수명을 결정하는 적절한 소유자 일 수 있으며, 특히 delete을 사용하여 콜백 객체를 없애고, auto_ptr 등으로 고정). 그 의미가 추가 콜백이 필요하지 않을 때를 결정할 수있는 경우와 같은 경우에만 - 질문에 제공된 것과 같이 부족한 정보로는 알 수 없습니다.

는 또한 콜백을 생성 (그리고 발신자 후원자에 대한 소유권을 전달)을 명시 적으로 콜백 개체를 삭제하려면 "호출자 후원자를"요청 (더 이상 콜백을 수행하지 것을 코드에 대한 방법을해야 할 수도 있습니다) 더 이상 콜백이 필요하지 않을 것이라고 결정한 코드 일 때.

다른 답변을 사라 "사람이 소유"에 대한 문제를 만들기 위해 auto_ptr보다 스마트 포인터를 언급 (부스트의 shared_ptr, 손으로 압연 참조 횟수는 ...) - 좋을 수는 C를 사용하여 강제하는 경우 ++ 다른 이유로 인해 가비지 수집을 사용하는 언어를 실제로 사용하고 있지만 C++을 선택하면 메모리 사용을 완전히 제어 할 수 있기 때문에 객체 소유권 및 수명 문제를 올바르게 결정할 수 없습니다. 또한 리소스를 심각하게 최적화 할 수 있습니다 사용량은 어느 정도의 자동화 된 "가비지 수집"과 비교할 때 중요합니다. 할 때은 물론 리소스 사용을 면밀히 제어해야합니다. 그 FUNC()를 가정

1

는 특정 콜백 객체를 사용하는 유일한 기능이며,이 코드는 항상 콜백 객체가 만들어 순서대로 실행되는 것을, 나는()를 호출 FUNC 후 넣어 것입니다. 이렇게하면 func()을 편집해야한다면 콜백 객체가 삭제되는 위치에 대해 걱정할 필요가 없습니다. 또한 func()의 포인터가 함수가 끝나면 멈춰 있어야했기 때문에 모든 포인터가 비워 졌음을 보장합니다. 왼쪽으로 가리키는 포인터는 포인터를 삭제 한 것입니다.

나는 C++의 포인터에 대한 이해가 결함이있는 경우 사과하고 난 항상 그것에 대해 약간 혼란스러워했다, 잘못된 대답을 나에게 발생했습니다. 당신이 실행 FUNC() 후 콜백 포인터에 하나의 참조가 거기에 의미를 넣어 코드가 사소한 경우

3

, 나는 auto_ptr은 충분할 것으로 판단 :

std::auto_ptr<Callback> p(new Callback); 
func(p.get()); 

이 또한 정상적으로 보장 func()는 메모리가 해제 될 예외를 던집니다.

+0

"func (p.get())"를 원하셨습니까? – bk1e

+0

예, 감사합니다. –

+0

소유권을 함수에 전달하지 않는 경우. 이것은 어리 석다. 그냥 정상적인 개체를 만들고 포인터를 전달하십시오! 콜백 p; func (&p); –

1

코드 당신이 쓴 것과 같은 간단한 경우와 func() 직접 어떤 점에서 콜백을 호출,이 충분합니다 :

Callback p; 
func(&p); 

그러나, func()가에 대한 참조 또는 포인터를 저장하는 경우 콜백 다른 곳에서는 해당 참조의 수명을 추적해야합니다.

관련 문제