C ++에서 delete와 delete[]연산자 의 차이점은 무엇입니까 ?
vector<>가능할 때마다 배열 대신 사용 합니다.
std::unique_ptr<int>(new int[3])규칙 delete을 호출하기 때문에 eg를 작성하지 말아야한다는 점에서 차이를 알아야합니다 . 대신 사용해야합니다std::unique_ptr<int[]>
C ++에서 delete와 delete[]연산자 의 차이점은 무엇입니까 ?
vector<>가능할 때마다 배열 대신 사용 합니다.
std::unique_ptr<int>(new int[3])규칙 delete을 호출하기 때문에 eg를 작성하지 말아야한다는 점에서 차이를 알아야합니다 . 대신 사용해야합니다std::unique_ptr<int[]>
답변:
delete연산자는 메모리 할당을 해제하고 만든 단일 개체의 소멸자를 호출합니다 new.
delete []연산자로 작성된 오브젝트의 배열을위한 메모리를 할당 해제 호출 소멸자 new [].
delete에 의해 반환 된 포인터 new []또는 delete []에 의해 반환 된 포인터를 사용하면 new정의되지 않은 동작이 발생합니다.
delete[]운영자는 삭제 배열하는 데 사용됩니다. delete연산자 배열이 아닌 개체를 삭제하는데 사용된다. 배열 또는 배열이 아닌 객체가 배열의 요소 또는 배열이 아닌 객체의 소멸자를 호출 한 후 (최종적으로) 점유 한 메모리를 삭제하기 위해 각각 호출 operator delete[]하고 operator delete기능합니다.
다음은 관계를 보여줍니다.
typedef int array_type[1];
// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;
// create and destroy an int
int *b = new int;
delete b;
// create and destroy an int[1]
int *c = new int[1];
delete[] c;
// create and destroy an int[1][2]
int (*d)[2] = new int[1][2];
delete [] d;
위해 new배열을 생성하는이 (그래서, 어느 new type[]또는 new어레이 형 구조체에 적용), 표준기로 찾는다 operator new[]배열의 요소 타입 클래스 또는 전역에, 그리고 요청 된 메모리의 양을 전달한다. N * sizeof(ElementType)원하는 경우 보다 더 많이 요청할 수 있습니다 (예 : 요소 수를 저장하기 위해 나중에 삭제할 때 소멸자 호출 횟수를 알고 있음). 클래스 operator new[]가 메모리 양에 추가하여 다른 size_t것을 받아들이면 두 번째 매개 변수는 할당 된 요소 수를받습니다. 원하는 목적 (디버깅 등)에 이것을 사용할 수 있습니다.
를 들어 new배열이 아닌 객체를 생성하는, 그것은 찾습니다 operator new요소의 클래스 또는 전역 범위에서. 요청 된 메모리 양을 전달합니다 (정확히 sizeof(T)항상).
의 경우 delete[]배열의 요소 클래스 유형을 살펴보고 소멸자를 호출합니다. 사용 된 operator delete[]함수는 요소 유형의 클래스에있는 함수이거나 전역 범위에없는 함수입니다.
에 대해 delete전달 된 포인터가 실제 객체 유형의 기본 클래스 인 경우 기본 클래스에는 가상 소멸자가 있어야합니다 (그렇지 않으면 동작이 정의되지 않음). 기본 클래스가 아닌 경우 해당 클래스의 소멸자가 호출 operator delete되고 해당 클래스 또는 글로벌 operator delete이 사용됩니다. 기본 클래스가 전달되면 실제 객체 유형의 소멸자가 호출 operator delete되고 해당 클래스 에서 찾은 것이 사용되거나없는 경우 전역 operator delete이 호출됩니다. operator delete클래스의에 유형의 두 번째 매개 변수가있는 경우 size_t할당 해제 할 요소 수를 수신합니다.
이것이 C ++ malloc/ free, new/ delete, new[]/ 에서 할당 / DE- 할당 패턴의 기본 사용법
delete[]
우리는 그에 따라 사용해야합니다. 하지만 차이점이 특정 이해를 추가하고 싶습니다 delete과delete[]
1) 단일 객체에delete 할당 된 메모리를 할당 해제하는 데 사용됩니다
2) 객체 배열에delete[] 할당 된 메모리를 할당 해제하는 데 사용됩니다
class ABC{}
ABC *ptr = new ABC[100]
우리가 말할 때 new ABC[100]컴파일러는 할당해야 할 객체 수에 대한 정보를 얻을 수 있으며 (여기서는 100) 생성 된 각 객체에 대해 생성자를 호출합니다.
그러나 우리가 단순히이 경우 delete ptr에 사용한다면 컴파일러는 ptr소멸자를 호출하고 결과적으로 단 하나의 객체에 대한 메모리를 삭제 하는 객체 수를 알지 못합니다 (소멸자를 호출하고 나머지 99 객체를 할당 해제합니다). 따라서 메모리 누수가 발생합니다.
delete [] ptr이 경우 에 사용해야 합니다.
free()이것과 저것입니다. 의사 소멸자 패턴을 사용하는 경우 for루프를 사용하여 모든 객체에 대해 한 번씩 호출해야 합니다.
이 질문을했을 때, 실제 질문은 "둘 사이에 차이가 있는가? 런타임이 배열 크기에 대한 정보를 유지할 필요가 없기 때문에 어떤 의미인지 알 수 없습니까?" 이 질문은 "관련 질문"에 나타나지 않기 때문에 저와 같은 사람들을 돕기 위해 "삭제 [] 연산자가 필요한 이유는 무엇입니까?"