NULL 포인터를 삭제해도 안전합니까? 안전합니까? 그리고 좋은 코딩 스타일입니까?

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 (스칼라 구문)에 안전합니다.