경고 C6278
'variable'은 배열 새 []와 함께 할당되지만 스칼라 삭제를 사용하여 삭제됩니다. 소멸자는 호출되지 않습니다.
설명
이 경고는 C++ 코드에만 나타나며 호출 함수가 배열 new []
연산자와 함께 메모리를 일관되지 않게 할당했지만 스칼라 delete
연산자를 사용하여 해제했음을 나타냅니다. 이 사용은 C++ 표준 및 Microsoft C++ 구현에 따라 정의되지 않은 동작입니다.
이 불일치로 인해 문제가 발생할 가능성이 있는 세 가지 이상의 이유가 있습니다.
배열의 개별 개체에 대한 생성자가 호출되지만 소멸자는 호출되지 않습니다.
전역 또는 클래스별로
operator new
operator delete
호환operator new[]
operator delete[]
되지 않는 경우 예기치 않은 결과가 발생할 수 있습니다.정의되지 않은 동작에 의존하는 것은 항상 위험합니다.
이 결함의 정확한 파급 효과는 예측하기 어렵습니다. 이로 인해 메모리 할당 해제를 수행하는 소멸자가 있는 클래스에 대한 누수 발생이 발생할 수 있습니다. 의미상 중요한 작업을 수행하는 소멸자가 있는 클래스의 동작이 일관되지 않거나 연산자가 재정의된 경우 메모리 손상 및 충돌이 발생할 수 있습니다. 다른 경우에는 컴파일러 및 해당 라이브러리의 구현에 따라 불일치가 중요하지 않을 수 있습니다. 분석 도구가 이러한 상황을 항상 구분할 수 있는 것은 아닙니다.
메모리가 배열과 함께 할당된 경우 배열 new []
을 사용하여 delete[]
해제해야 합니다.
코드 분석 이름: ARRAY_NEW_DELETE_MISMATCH
예시
다음 샘플 코드는 경고 C6278을 생성합니다.
class A
{
// members
};
void f( )
{
A *pA = new A[5];
// code ...
delete pA;
}
이 경고를 수정하려면 다음 샘플 코드를 사용합니다.
void f( )
{
A *pA = new A[5];
// code ...
delete[] pA;
}
배열의 기본 개체가 , , float
enum
또는 포인터와 같은 int
기본 형식인 경우 호출할 소멸자가 없습니다. 이러한 경우 경고 C6283 이 대신 보고됩니다.
메모리 누수 및 delete
예외 측면에서 많은 문제를 사용하고 new
있습니다. 이러한 종류의 잠재적 누출을 완전히 방지하려면 C++ STL(표준 라이브러리)에서 제공하는 메커니즘을 사용합니다. 여기에는 < a0/> unique_ptr
및 컨테이너(예: vector
.)가 포함shared_ptr
됩니다. 자세한 내용은 스마트 포인터 및C++ 표준 라이브러리를 참조하세요.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기