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
루프를 사용하여 모든 객체에 대해 한 번씩 호출해야 합니다.
이 질문을했을 때, 실제 질문은 "둘 사이에 차이가 있는가? 런타임이 배열 크기에 대한 정보를 유지할 필요가 없기 때문에 어떤 의미인지 알 수 없습니까?" 이 질문은 "관련 질문"에 나타나지 않기 때문에 저와 같은 사람들을 돕기 위해 "삭제 [] 연산자가 필요한 이유는 무엇입니까?"