2010-04-27 2 views
0

가리키는 포인터 목록이있는 개체에 벡터를 포함시키는 것이 현명한 방법일까요?포인터 - 안전 개체?

개체를 삭제할 때 null 포인터 예외를 방지하기 위해 포인터를 가리키는 포인터를 모두 삭제할 수 있습니까?

+0

"가리키는 모든 포인터를 삭제할 수 있습니다."가리키는 모든 개체를 의미합니까? 이 질문에 대한 대답은 필연적으로 당신이하는 일에 달려 있지만 어쩌면 아니오에 달려 있습니다. –

답변

1

당신을 도울 수 (더 쉽게 방어 적이기에) 컨트롤의 외부에 복사 할 수 있습니다 어렵다 가장 좋은 방법은 weak pointer semantic을 사용하는 것입니다. Boost Smart Pointer 라이브러리에 구현이 있습니다 (weak_ptr 참조). 그것은 여러분이 묘사하는 참조 그래프를 뒤집어 설명하는 문제를 해결합니다. 이 포인터는 송신자가 객체를 삭제할 때 0으로 설정하는 단일 공통 카운터 인스턴스를 참조합니다. 따라서 모든 weak_ptr 참조가 단일 카운터를 가리 키기 때문에 모든 카운터가 즉시 변경 사항을 볼 수 있으므로 객체가 사라지는 시점을 알 수 있습니다.

3

아니요. 한 번만 포인터를 삭제할 수 있습니다. 이미 삭제 된 무언가 ("더블 해방")을 확보하는 것은

A* foo = new A(); 
A* bar = foo; 
delete foo; 
delete foo; // <-- BAD 
delete bar; // <-- EQUALLY BAD 

당신이 auto_ptr 같은 뭔가를 찾고있는 것 같습니다 정의되지 않는다; 당신은 그것을 들여다 볼 수 있습니다. 객체가 파괴되었을 때 객체를 가리키는 모든 포인터를 0으로 만들려고한다면 그 일을 할 수있는 방법이 없습니다.

+0

간단히 말해서 현명한 아이디어는 아닙니다. –

0

달성하고자하는 것을 실제로 이해하지 못하고 x 포인터를 삭제하면 멀리 당신을 데려가 ...

delete hapenned 후 나쁜 포인터가 발생하지 않도록하려면 스마트 포인터, 특히 boost::shared_ptr 봐야합니다.

는 개체가 마지막 shared_ptr의 포인팅이 파괴되거나 재설정 될 때 삭제 을 보장하는 지적했다.

더 이상 수동으로 delete 포인터를 사용하면 shared_ptr가 단독으로 실행됩니다. 일반적인 도움이 포인터와 함께 작동하도록로서

당신은 다른 boosts smart pointers 또는

0

std::auto_ptr 기술적으로 말하면, 당신이 해결하려고하는 문제가있다 "매달려 포인터"를 체크 아웃 할 수 있습니다. auto_ptr을 살펴보고 "스마트 포인터"를 검색해보십시오 ... 적어도 당신의 목표는 당신의 객체를 가르키는 모든 포인터를 제로라고 가정합니다.

개체를 사용하는 모든 기능도 저장 위치 주소를 제공하는 것은 매우 어렵거나 이상합니다. 그 객체와 포인터가 당신의 궁극적 인 목표는 때 개체 감지하는 경우 Valgrind의 같은

일부 도구가 너무