언급 한 니모닉 (new [] 및 [delete for new])은 좋은 습관이며 의무 사항으로 시행해야합니다.
그러나 기본 유형 (int, char, void * 등) 및 클래스는 삭제 및 삭제 [] 사이에 큰 차이가 있습니다.
new와 malloc의 차이점은 생성자를 호출하는 반면 new는 생성자를 호출하지 않는다는 것입니다. 소멸자와 관련해서는 delete와 free가 같은 관계가 발생합니다.
예제에서 간단한 유형의 배열이 할당 될 때와 객체 할당 된 배열이있는 경우의 두 가지 상황을 제공했습니다.
동작이 다릅니다.
단순 유형의 경우 []을 삭제하면 동일한 결과가 생성됩니다.
이유? 음, 기본적으로 char *의 10 개 포인터 블록을 할당 했으므로 삭제하는 것은 문제가되지 않습니다 (할당 된 메모리가 해제 됨).당신이
char* a = new char[100];
이있는 경우 즉
, 다음
delete a;
및
delete[] a;
이 동일한 결과를 생성합니다 (새 [] 사용주의)
이 동작은 생성자와 소멸자가있는 개체의 경우에는 다릅니다.
class SimpleClass
{
public:
SimpleClass(){printf("constructed");
~SimpleClass()(printf("destructed");
}
를 다음 코드 :
는 이제 다음 클래스를 보자
SimpleClass* arr1 = new SimpleClass[5];
SimpleClass* arr2 = new SimpleClass[5];
char* arr3 = new char[5];
char* arr4 = new char[5];
delete[] arr4;
delete arr3;
delete[] arr2;
delete arr1; //notice the surprise ?
실행을 위의 코드를 (당신이 할 수있는 경우) 비주얼 스튜디오와 메모리 뷰어를 엽니 다. ptrs arr4 및 arr3에 할당 된 메모리가 arr2와 동일하게 올바르게 무효화됩니다.
그러나 [] 호출없이 arr1을 삭제하려고하면 SigSev 오류가 발생합니다.
왜?
arr2의 경우에는 할당 된 오브젝트의 배열을 가지며, []는 문이 ""어레이에서 각 소멸자 통과 "를 의미
그것을 arr1 경우 수단 삭제할 이유는. 소멸자 호출 포인터 arr1에 할당 된 객체 ... 그 주소에 1 개 이상의 객체가 할당되었다는 사실을 고려하면 처음 할당 된 크기보다 작은 페이지를 해제하려고 시도하여 결국 불행한 일입니다.
결론 :
삭제 []에 대한 삭제 [] 및 삭제를위한 새로운!
매번 작동합니다!
'delete []'당신은'new []'이고,'delete'는'new'입니다. – Cornstalks
그리고 대답은 어쨌든 간단합니다. 'new []'를 사용한다면'delete []'를 사용해야합니다. –
_ "새로운 []을 사용하면 '삭제해야합니다'라는 사실을 알고 있습니다. _ - 답변이 있습니다. –