Share via


C6278

경고 C6278: <variable>이(가) 배열 new []를 사용해 할당되었지만 스칼라 delete로 삭제되었으므로 소멸자가 호출되지 않습니다.

이 경고는 C++ 코드에서만 나타나며 호출하는 함수에서 배열 new [] 연산자를 사용해 메모리를 할당했지만 스칼라 delete 연산자를 사용해 일관성 없이 해제했음을 나타냅니다. 이것은 C++ 표준 및 Microsoft VC++ 구현에 따라 정의되지 않은 동작입니다. 이 경우 문제를 발생시킬 수 있는 원인으로는 적어도 세 가지가 있습니다.

  • 배열의 개별 개체에 대한 생성자는 호출되었지만 소멸자가 호출되지 않았습니다. 

  • 전역 또는 클래스 전용 operator newoperator deleteoperator new[] 및 **operator delete[]**와 호환되지 않는 경우 예상치 못한 결과가 발생할 수 있습니다.

  • 정의되지 않은 동작을 사용하면 항상 매우 위험합니다.

이 오류의 정확한 결과는 예측하기 어렵습니다. 이 경우 메모리 할당 취소를 수행하는 소멸자를 사용하는 클래스에 대해 누수가 발생할 수 있으며, 의미상 중요한 몇 가지 작업을 수행하는 소멸자를 사용하는 클래스의 경우 일관되지 않은 동작이 발생하거나 연산자가 재정의된 경우 메모리 손상 및 충돌이 발생할 수 있습니다. 다른 경우에는 컴파일러와 라이브러리의 구현에 따라 이러한 불일치가 중요하지 않을 수 있습니다. 분석 도구에서 이러한 상황을 항상 구분할 수 있는 것은 아닙니다.

메모리를 배열 **new []**로 할당한 경우 일반적으로 배열 **delete[]**로 해제해야 합니다.

예제

다음 샘플 코드에서는 이 경고를 발생시킵니다.

class A
{
  // members
};

void f( )
{
  A *pA = new A[5];
  // code ...
  delete pA;
}

이 경고를 해결하려면 다음 샘플 코드를 사용합니다.

void f( )
{
  A *pA = new A[5];
  // code ...
  delete[] pA;
}

배열의 내부 개체가 int, float, enum 또는 포인터 등과 같은 기본 형식인 경우 호출할 소멸자가 없습니다. 이러한 경우에는 경고 C6283이 대신 보고됩니다.