2015-01-06 8 views
1

내가 사용하는 경우 새 [] 나 [] 삭제해야 할 것을 알고 배열의 배열에서 삭제,하지만 내 의심의 여지 :C++ [] 삭제 대

선언 :

char **data; // This will be a bi-dimensional array 

구축 :

data = new char*[10]; 
for (int i=0; i<10; ++i) 
{ 
    data[i] = new char[128]; 
} 

파괴 :

for (int i=0; i<10; ++i) 
{ 
    delete data[i]; // <--- delete or delete[] ??? 
} 
delete[] data; 

또 다른를 내가 객체의 배열을 가질 경우 :

선언 :

object = new myClass*[10]; 
for (int i=0; i<10; ++i) 
{ 
    object[i] = new myClass(); 
} 

가 파괴 :

for (int i=0; i<10; ++i) 
{ 
    delete object[i]; // <--- this object[] is not an array, right? 
} 
delete[] object; // <--- Is this correct? 
+14

'delete []'당신은'new []'이고,'delete'는'new'입니다. – Cornstalks

+1

그리고 대답은 어쨌든 간단합니다. 'new []'를 사용한다면'delete []'를 사용해야합니다. –

+8

_ "새로운 []을 사용하면 '삭제해야합니다'라는 사실을 알고 있습니다. _ - 답변이 있습니다. –

답변

3

당신은 기본적으로 자신의 질문에 대답 구축

myClass **object; 

. data[i]은 배열이므로 delete[]이 필요합니다. object[i]new으로 할당되었으므로 delete이됩니다. 객체와 데이터는 모두 배열이기 때문에 delete[]이 필요합니다.

1

포인터의 첫 번째 치수 data은 배열입니다. 두 번째 차원도 배열입니다. 따라서 new[]에서 예약 한 메모리를 적절하게 할당 해제하려면 delete[]을 사용해야합니다.

개체의 경우 첫 번째 차원은 new을 사용하여 할당되었습니다. 따라서 delete을 사용해야합니다. 배열이기 때문에 objectdelete[]을 사용하십시오.

0

언급 한 니모닉 (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 개 이상의 객체가 할당되었다는 사실을 고려하면 처음 할당 된 크기보다 작은 페이지를 해제하려고 시도하여 결국 불행한 일입니다.

결론 :

삭제 []에 대한 삭제 [] 및 삭제를위한 새로운!

매번 작동합니다!

+0

"간단한 유형의 경우 []을 삭제하고 삭제하면 동일한 결과가 나타납니다." 결과는 모든 유형에 대해 정의되지 않은 것과 같습니다. – Quentin