3

delete이 불완전한 형식의 포인터에 적용될 경우 Visual C++에 C4150 warning이 있습니다.C++에서 불완전한 유형을 삭제해도 오류가 발생하지 않는 실제 사례가 있습니까?

이러한 경우에는 표준에 따라 정의되지 않은 동작이 발생합니다. Visual C++에서 AFAIK을 사용하면 기본값이 operator delete()이고 아무런 소멸자도 호출되지 않으므로 수많은 버그가 발생할 수 있습니다.

이제 Visual C++에서 #prarma warning(error : 4150)을 사용하여 해당 경고를 오류로 처리 할 수있었습니다. 거기에 이유는 Visual C++에서 기본적으로 경고 및 오류가 아닌 것 같아요.

실생활 코드에서 이러한 사례를 허용하고 싶습니다. 왜 나는 경고를 컴파일러 오류로 전환하지 않겠습니까?

+0

불완전한 유형으로 '무효'개수가 있습니까? 그렇다면 [this] (http://stackoverflow.com/questions/6172232/is-it-undefined-behaviour-to-delete-a-null-void-pointer)와 관련있을 수 있습니다. :) – Xeo

+0

Microsoft가 제품과 관련하여 무엇을 의미하는지 결코 알 수 없습니다. – Dani

+0

사소한 소멸자가있는 클래스일까요? –

답변

5

항상 UB가 아닙니다. 객체가 삭제되는 경우

은 삭제 시점에서 불완전한 클래스 형을 가지고 있으며, 전체 클래스가 아닌 사소한 소멸자 또는 해제 기능을 가지고, 행동이 운데 ​​Fi를 네드된다.

+0

에헴 정확하게 내 느낌 (의견 있음)! 사소한 소멸자가있는 클래스는 UB를 발생 시켜서는 안됩니다. –

2

포인터가 0 (또는 C++ 11에서는 nullptr)이면 어떨까요? delete 0;은 정의 상 no-op입니다.

+0

'0'은 불완전한 유형으로 계산합니까? –

+0

@Als : 아니요.하지만'struct s; s * p = 0; p를 삭제하십시오. 나는 단지'delete 0;'과 동일하다는 것을 강조하고 싶었다. – Xeo

+0

Ah okay..Ofcourse, 이것은 유형이 불완전한 불투명 한 포인터이지만 '0'을 가리키는 경계선의 경우이므로 '삭제'는 No-Op입니다. –

관련 문제