예.
그것이 할 수있는 유일한 "유해"는 비 효율성 (불필요한 저장 작업)을 프로그램에 도입하는 것입니다. 그러나이 오버 헤드는 대부분의 경우 메모리 블록 할당 및 해제 비용과 관련하여 중요하지 않습니다.
당신이 그것을하지 않으면, 당신은 것입니다 성가신 포인터 derefernce 버그 어느 날이있다.
나는 항상 매크로를 삭제에 사용합니다.
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(그리고 배열, free (), 해제 핸들과 비슷 함)
호출 코드의 포인터를 참조하는 "self delete"메소드를 작성할 수도 있으므로 호출 코드의 포인터를 NULL로 강제합니다. 예를 들어 많은 객체의 하위 트리를 삭제하려면
static void TreeItem::DeleteSubtree(TreeItem *&rootObject)
{
if (rootObject == NULL)
return;
rootObject->UnlinkFromParent();
for (int i = 0; i < numChildren)
DeleteSubtree(rootObject->child[i]);
delete rootObject;
rootObject = NULL;
}
편집하다
예, 이러한 기술은 매크로 사용에 대한 일부 규칙을 위반합니다 (예, 템플릿과 동일한 결과를 얻을 수 있습니다). 그러나 수년 동안 사용하여 죽은 메모리에 액세스 한 적이 없었 습니다. 직면 할 수있는 문제를 디버깅하는 데 가장 많은 시간이 소요됩니다. 실제로 수년 동안 그들은 내가 소개 한 모든 팀에서 whjole 클래스의 버그를 효과적으로 제거했습니다.
위의 방법을 구현할 수있는 많은 방법이 있습니다. 발신자의 포인터를 NULL로하지 않는 메모리를 해제하는 수단을 제공하는 대신 사람들이 객체를 삭제하면 포인터를 NULL로 강제하는 아이디어를 설명하려고합니다. .
물론, 위의 예는 자동 포인터를 향한 단계 일뿐입니다. OP가 자동 포인터를 사용하지 않는 경우에 대해 구체적으로 요구했기 때문에 제안하지 않았습니다.
delete
포인터를 0으로 만드는 것이 좋은 이유 중 하나는 널 포인터에 안전합니다 .