7

경고 컴파일이 유사 코드의 조각을 벗었 :C++ 인플레 이스 소멸자 내 코드에서 인플레 이스 소멸자를 사용하고

warning C4189: 'b': local variable is initialized but not referenced

심지어 -Wall로, ++하지만 g에서 잘 컴파일합니다. 왜 내가 경고를 받는지 아는가? 이것은 컴파일러의 버그일까요? b는 b->~Node() 호출에서 명확하게 사용됩니다.

struct Node { 
    ~Node() { 
    } 
}; 

그러나 지금까지의 내가 이런 말을 수 차이를 수행하지 않아야합니다

또한 내가이에 노드 구현을 변경할 때 잘 컴파일 것으로 보인다.

+1

흠, 내 생각 엔 옵티마이 저는 기본 소멸자에 대한 호출을 완전히 제거하고 'b'가 사용되지 않는다고 추측합니다. 최적화 된 빌드를 컴파일 할 때만 또는 최적화되지 않은/디버깅 빌드에서도이 경고가 표시됩니까? –

+0

또한 디버그 빌드에 있습니다. – martinus

+0

흥미 롭습니다. 32 비트 및 64 비트 빌드와 VS 2010, 2012 및 2015에서 옵티 마이저를 활성화하고 비활성화 한 상태에서 재 작성합니다. 버그가있는 것처럼 보입니다. (그것은 * 물론 * 최적화 된 빌드에서 소멸자에 대한 호출을 제거하고 실제로 생성자에 대한 호출을 생략합니다. 오브젝트 코드는'malloc'과'free'만을 호출합니다.) –

답변

2

C++에서 컴파일러 경고 표준이 없습니다. 따라서 각 컴파일러는 그가 원하는 곳마다 경고 할 수 있습니다. 의 문제입니다.

기본 소멸자 일 수 있습니다 (예 : 모든 로컬 변수는 기본적으로 해당 범위의 끝에서 삭제됨). 경고는 의미가 있습니다.

2

Trivial destructor

다음의 모두에 해당하는 경우 클래스 T의 소멸자는 간단하다 :

소멸자는 사용자가 제공 한 (의미, 그것은 암시 적 선언, 또는 명시 적으로 정의되지
    • 소멸자가 가상이 아닙니다 (즉, 기본 클래스 소멸자가 가상이 아닙니다)
    • 모든 직접 기본 클래스에는 간단한 소멸자가 있습니다
    • 클래스 유형 (또는 클래스 유형의 배열)의 모든 비 정적 데이터 멤버에는 간단한 소멸자가 있습니다.

    소소한 소멸자는 아무런 작업도 수행하지 않는 소멸자입니다. 사소한 소멸자가있는 객체는 삭제 표현식을 필요로하지 않으며 단순히 저장 영역을 할당 해제하여 처리 할 수 ​​있습니다.