C ++에서 delete vs delete [] 연산자


136

C ++에서 deletedelete[]연산자 의 차이점은 무엇입니까 ?


이 질문과 관련이있을 수도 있습니다. stackoverflow.com/questions/1913343/…
sharptooth

7
delete 및 delete []의 문제는 내가 스마트 포인터를 좋아하는 이유 중 하나이며 vector<>가능할 때마다 배열 대신 사용 합니다.
David Thornley


@DavidThornley 스마트 포인터를 사용하는 경우 여전히 정의되지 않은 동작으로 배열에서 std::unique_ptr<int>(new int[3])규칙 delete을 호출하기 때문에 eg를 작성하지 말아야한다는 점에서 차이를 알아야합니다 . 대신 사용해야합니다std::unique_ptr<int[]>
Arthur Tacca

답변:


151

delete연산자는 메모리 할당을 해제하고 만든 단일 개체의 소멸자를 호출합니다 new.

delete []연산자로 작성된 오브젝트의 배열을위한 메모리를 할당 해제 호출 소멸자 new [].

delete에 의해 반환 된 포인터 new []또는 delete []에 의해 반환 된 포인터를 사용하면 new정의되지 않은 동작이 발생합니다.


3
int 나 char (생성자 / 소멸자가없는)과 같은 기본 유형의 new [] 배열에서 delete를 사용하여 정의되지 않은 동작을 유발하는지 궁금합니다. 기본 유형을 사용할 때 배열 크기가 어디에도 저장되지 않는 것 같습니다.
thomiel

21
표준이 수행 될 때 발생하는 사항을 표준이 정의하지 않으면 컴파일러가 원하는대로 결정적으로 수행하더라도 "정의되지 않은 동작"으로 정의됩니다. 다른 컴파일러는 완전히 다른 것을 할 수 있습니다.
Rob K

"char ** strArray"와 같은 C 문자열 배열이있을 때이 오류가 발생했습니다. 내가하는 것처럼 배열이있는 경우 배열을 반복하고 각 요소를 삭제 / 해제 한 다음 strArray 자체를 삭제 / 해제해야합니다. ITCALLS DESTRUCTORS 이후에 작동하지 않는 배열에서 "delete []"를 사용하면 IT CALLS DESTRUCTORS는 실제로 각 슬롯을 해제하지 않습니다.
Katianie

88

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할당 해제 할 요소 수를 수신합니다.


18

이것이 C ++ malloc/ free, new/ delete, new[]/ 에서 할당 / DE- 할당 패턴의 기본 사용법 delete[]

우리는 그에 따라 사용해야합니다. 하지만 차이점이 특정 이해를 추가하고 싶습니다 deletedelete[]

1) 단일 객체에delete 할당 된 메모리를 할당 해제하는 데 사용됩니다

2) 객체 배열에delete[] 할당 된 메모리를 할당 해제하는 데 사용됩니다

class ABC{}

ABC *ptr = new ABC[100]

우리가 말할 때 new ABC[100]컴파일러는 할당해야 할 객체 수에 대한 정보를 얻을 수 있으며 (여기서는 100) 생성 된 각 객체에 대해 생성자를 호출합니다.

그러나 우리가 단순히이 경우 delete ptr에 사용한다면 컴파일러는 ptr소멸자를 호출하고 결과적으로 단 하나의 객체에 대한 메모리를 삭제 하는 객체 수를 알지 못합니다 (소멸자를 호출하고 나머지 99 객체를 할당 해제합니다). 따라서 메모리 누수가 발생합니다.

delete [] ptr이 경우 에 사용해야 합니다.


3
이것이 정답이어야합니다. 다른 답변들에는 뚜렷한 차이점이 언급되어 있지 않습니다. "그러나 만약 우리가 단순히이 경우에 삭제 ptr을 사용한다면 컴파일러는 ptr이 얼마나 많은 객체를 가리키는 지 알지 못하고 소멸자를 호출하고 1 개의 객체에 대해서만 메모리를 삭제하게됩니다"
Don Larynx 2016 년

1
C에서 같은 것을 어떻게 달성합니까?
Dogus Ural

@DogusUral 왜? C에는 소멸자가 없으므로 free()이것과 저것입니다. 의사 소멸자 패턴을 사용하는 경우 for루프를 사용하여 모든 객체에 대해 한 번씩 호출해야 합니다.
Kotauskas

@DonLarynx의 올바른 차이점은 그것들을 혼합하면 잘못된 프로그램을 생성한다는 것입니다. 구현시 파괴 할 오브젝트 수를 있거나 그렇지 않을 수도 있습니다 . 그것이 잘못되었다는 것을 알 수 있고 문제의 위치를 ​​알려주는 프로그램을 중단시킵니다.
Caleth

6

연산자 delete와는 delete []만들어 개체를 파괴하는 각각 사용 new하고 new[], 할당 된 메모리에 반환 컴파일러의 메모리 관리자가 사용할 수 떠났다.

로 생성 된 객체 new는 반드시 로 제거해야하며로 delete생성 된 배열 new[]은로 삭제해야합니다 delete[].



0

delete하나의 단일 포인터 delete[]에 사용되며 포인터를 통해 배열을 삭제하는 데 사용됩니다. 이것은 당신이 더 잘 이해하는 데 도움 될 수 있습니다.


-6

글쎄 .. 어쩌면 나는 그것이 명시 적이라고 생각합니다. 연산자 delete와 연산자 delete[]는 구별되지만 delete연산자도 배열을 해제 할 수 있습니다.

test* a = new test[100];
delete a;

이미이 코드에는 메모리 누수가 없음을 확인했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.