NULL 포인터를 삭제해도 안전합니까?
그리고 좋은 코딩 스타일입니까?
답변
delete
어쨌든 검사를 수행하므로 측면에서 검사하면 오버 헤드가 추가되고 추악하게 보입니다. 아주 좋습니다 후에 NULL 포인터를 설정하는 것입니다 delete
(더블 삭제 및 기타 유사한 메모리 손상 문제를 방지하는 데 도움).
delete
기본적으로 매개 변수를 NULL로 설정하는 것이 좋을 것 입니다.
#define my_delete(x) {delete x; x = NULL;}
(R 및 L 값에 대해서는 알고 있지만 좋지 않습니까?)
답변
C ++ 0x 표준 초안에서.
$ 5.3.5 / 2- “[…] 다른 방법으로 delete 피연산자의 값은 널 포인터 값일 수 있습니다. [… ‘”
물론 아무도 NULL 값을 가진 포인터를 ‘삭제’하지는 않지만 안전합니다. 이상적으로는 NULL 포인터를 삭제하는 코드가 없어야합니다. 그러나 포인터 삭제 (예 : 컨테이너)가 루프에서 발생할 때 유용합니다. NULL 포인터 값을 삭제하는 것이 안전하기 때문에 NULL 피연산자를 삭제하도록 명시 적으로 검사하지 않고도 삭제 논리를 실제로 작성할 수 있습니다.
한편, C 표준 $ 7.20.3.2는 NULL 포인터에서 ‘무료’는 아무런 조치도 취하지 않는다고 말합니다.
free 함수는 ptr이 가리키는 공간을 할당 해제, 즉 추가 할당에 사용 가능하게합니다. ptr이 널 포인터이면 조치가 발생하지 않습니다.
답변
예, 안전합니다.
널 포인터를 삭제해도 아무런 해가 없습니다. 할당되지 않은 포인터가 0으로 초기화 된 다음 단순히 삭제되면 함수의 꼬리에서 테스트 횟수가 줄어 듭니다.
이전 문장이 혼동을 일으켰으므로, 설명 할 내용에 대한 예는 예외 안전하지는 않습니다.
void somefunc(void)
{
SomeType *pst = 0;
AnotherType *pat = 0;
…
pst = new SomeType;
…
if (…)
{
pat = new AnotherType[10];
…
}
if (…)
{
…code using pat sometimes…
}
delete[] pat;
delete pst;
}
샘플 코드로 선택할 수있는 모든 종류의 니트가 있지만 개념은 분명합니다. 포인터 변수는 0으로 초기화되므로 delete
함수 끝의 연산이 소스 코드에서 널이 아닌지 여부를 테스트 할 필요가 없습니다. 라이브러리 코드는 어쨌든 해당 검사를 수행합니다.
답변
널 포인터를 삭제해도 효과가 없습니다. 필요하지 않기 때문에 반드시 코딩 스타일이 좋지는 않지만 나쁘지는 않습니다.
좋은 코딩 방법을 찾고 있다면 대신 스마트 포인터 사용을 고려하면 전혀 필요하지 않습니다 delete
.
답변
ruslik의 답변 을 보완하기 위해 C ++ 14에서는 다음 구성을 사용할 수 있습니다.
delete std::exchange(heapObject, nullptr);
답변
삭제 연산자에 과부하가 걸리지 않는 한 안전합니다. 삭제 연산자를 오버로드하고 null 조건을 처리하지 않으면 전혀 안전하지 않습니다.
답변
NULL (즉, 배열 구문)을 삭제하는 것이 안전 하지 않다는 것을 경험했습니다 (VS2010). 이것이 C ++ 표준을 따르는 지 확실하지 않습니다.
그것은 이다 삭제 NULL (스칼라 구문)에 안전합니다.