소멸자에서 포인터를 NULL로 설정
객체 지향 프로그래밍에서는 메모리를 동적으로 할당하고 소멸자를 사용하여 해제하는 것이 일반적입니다. Bar 유형의 객체에 메모리를 할당하는 다음 클래스를 고려하십시오.
<code class="cpp">class Foo { public: Foo() : bar(new Bar) { } ~Foo() { delete bar; } void doSomething() { bar->doSomething(); } private: Bar* bar; };</code>
질문이 생깁니다. 소멸자에서 막대 포인터를 NULL로 설정하는 것이 유익한가요?
NULL 설정에 대한 주장
일반적인 믿음과는 달리 소멸자에서 포인터를 NULL로 설정하는 것은 권장되지 않습니다. 디버깅 목적으로는 좋은 생각처럼 보일 수 있지만 릴리스 빌드에서 잠재적으로 숨겨진 문제가 발생할 수 있습니다.
포인터가 NULL로 설정된 경우 삭제된 개체에 대한 매달린 참조가 어딘가에 존재할 수 있습니다. 디버그 빌드에서는 이 참조가 감지되어 진단 가능한 충돌을 유발합니다. 그러나 릴리스 빌드에서 버그가 있는 코드는 포인터가 NULL임을 인지하여 포인터 사용을 피할 수 있으며, 이로 인해 근본적인 문제가 모호해집니다.
대체 접근 방식
대신 포인터를 NULL로 설정하는 경우 알려진 잘못된 포인터 값으로 설정하는 것이 더 좋습니다. 이렇게 하면 삭제된 객체에 대한 모든 매달린 참조가 여전히 포인터를 사용하려고 시도하여 더 쉽게 진단하고 수정할 수 있는 충돌을 유발합니다.
예를 들어 다음 관용구를 사용할 수 있습니다.
<code class="cpp">~Foo() { delete bar; if (DEBUG) bar = (bar_type*)(long_ptr)(0xDEADBEEF); }</code>
이 접근 방식을 사용하면 릴리스 빌드가 매달린 참조를 감지하고 충돌하도록 보장하면서 디버그 빌드에서 잠재적인 버그를 포착할 수 있습니다.
결론
그 동안 소멸자에서 포인터를 NULL로 설정하는 것이 좋은 생각처럼 보일 수 있습니다. 그렇게 하면 릴리스 빌드에서 잠재적인 문제를 숨길 수 있습니다. 대신 진단 및 디버깅을 용이하게 하기 위해 디버깅 모드에서 알려진 잘못된 값에 포인터를 설정하는 것이 좋습니다.
위 내용은 소멸자에서 포인터를 NULL로 설정해야 합니까? 모범 사례 및 디버깅 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!