2012-12-18 3 views
3

나는 (내가 new ptr*[size]을 호출하여 생성 한) 포인터 배열을 가지고있다. 이 포인터는 모두 힙에 놓은 객체를 가리 킵니다.포인터의 배열을 삭제하는 올바른 방법

배열과 모든 new'd ptr을 삭제하는 적절한 방법은 무엇입니까?

이 내가 지금 무엇을 :

for (int i = 0; i < size; i++) delete array[i]; 
delete[] array; // Not sure since this double deletes array[0] 

이 나는 ​​그것을해야한다 생각합니까?

감사합니다.

+1

'ptr'이란 무엇입니까? 이것은 중요합니다. – djechlin

+1

올바른 방법은이 작업을 수행하지 않는 것입니다. 아마도'std :: vector >'을 선호하기 때문에 수동으로 정리할 필요가 없습니다. –

+0

int로 대체 할 수 있다고 가정 해 봅시다 – jamesatha

답변

9

new으로 할당 된 모든 포인터는 해당 delete이됩니다. new []으로 할당 된 모든 포인터는 해당 delete []을 가져옵니다. 그게 정말로 당신이 알아야 할 전부입니다. 물론, 동적으로 할당 된 배열을 가지고 동적으로 할당 된 포인터를 가지고있을 때 할당 해제는 역순으로 이루어져야합니다.

그래서 올바른 관용구 내가하고 사용하는 것이 좋습니다 "고 그만"라고 다음의 과정 ...

int main() 
{ 
    int **container = new int*[n]; 
    for(int i = 0; i < n; ++i) 
     container[i] = new int[size]; 

    // ... and to deallocate... 
    for(int i = 0; i < n; ++i) 
     delete [] container[i]; 

    delete [] container; 
} 

수 그리고 것이라고 따르는 std::array 또는 std::vector (및 템플릿 유형은 unique_ptr<int> 것).

+0

(+1) 전체 답변이지만 '역순'의 경우 +1입니다. 이론적으로 할당/할당 해제 순서는 중요하지 않지만 역순으로 할당을 해제하는 것이 더 효율적이라는 것에 동의합니다 ... – umlcat

+0

@mallcat : 할당 취소 순서는 중요합니다. 이 예제에서'container [n]'은'delete [] container'가 이미 호출 된 경우 정의되지 않은 동작을 낳습니다. –

+0

내가 얻지 못하는 부분은 같은 것을 가리키는 포인터로 지우는 'delete [] container [0]'와 'delete [] container'입니다. – jamesatha

2

네, 그렇게 생각합니다. 각 요소에 대해 new을 수행 했으므로 각 요소는 delete입니다. 그리고 전체 배열에 대해 new[]을 수행했기 때문에 전체 배열 delete[]이 필요합니다. 그 배열은 실제로 배열이 아닌

int** array = new int*[5]; 
for (int i = 0; i < 5; i++) { 
    array[i] = new int; 
} 

참고 : @djechlin으로

는 바로 거기에 갈 정말로 충분한 정보가 아니다,하지만 난 당신의 이전 코드를 추정하고있어이 같은 것입니다, 코멘트에 말한다 유형. 이것은 "int에 대한 포인터"이고 포인터가 가리키는 포인터의 배열은 new[]으로 할당되었습니다. 그래서 delete[]해야합니다.

+0

OP의 질문에서 명확하지 않습니다 -'ptr'이 어떻게 할당되었는지 모르겠고 그의 코드에서'new' 만 볼 수 있습니다. 오직 하나만'delete' 여야합니다. – djechlin

+0

하지만 배열 [0]을 삭제하지 않고 배열 지점을 같은 것으로 삭제하지 않습니까? – jamesatha

+0

@djechlin "이 포인터는 모두 힙에 놓은 객체를 가리 킵니다." –

0

예, 먼저 배열 포인트의 요소가있는 각 개체를 삭제 한 다음 포인터 배열 자체를 삭제합니다. 메모리 관리를 확인하려면 valgrind과 같은 도구를 사용할 수 있으므로 대부분의 오류를 발견 할 수 있습니다.

1

예. 먼저 배열 포인터가 가리키는 각 객체를 해제해야합니다. 그런 다음 배열 자체를 해제해야합니다. 그와 같은 순서로. 순서를 바꾸면 객체에 대한 참조가없고 많은 메모리가 누출됩니다.

관련 문제