2010-03-21 8 views
24

의 배열이 나는 할당 객체 나는이 배열을 삭제하는 방법을[] 객체

Objects *array = new Objects[N]; 

의 배열했다? 그냥

delete[] array; 

또는 배열 요소를 반복하는 중입니까?

for(int i=0;i<N;i++) 
    delete array[i]; 
delete[]; 

감사

는 UPDATE :

나는 컴파일 코드를 강제로

delete &array[i]; 

로 루프 본문을 변경했습니다.

+0

포인터 배열 또는 배열 포인터일까요? – osgx

+1

배열에 대한 포인터입니다. – Naveen

+4

이렇게하는 중 : 'delete & array [i];' 부정확하다. 요소 배열 [i]을 할당하는 데 new를 사용하지 않으므로 삭제하면 안됩니다. 전체 배열을 삭제하십시오. –

답변

38

new의 모든 사용은 delete의 균형을 이루어야하며 new[]의 모든 사용은 delete[]과 균형을 유지해야합니다.

for(int i=0;i<N;i++) 
    delete array[i]; 
delete[] array; 
이 같은 배열 초기화 된 경우에만 적절할 것

:

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

원래 코드가 당신에게 당신이 뭔가를 잘못 강력한 힌트하고있는하는 컴파일 오류를 준 사실을 .

진술, 의무 : new[]와 함께 배열을 할당하지 마십시오; 대신 std::vector을 사용하면 소멸자가 정리를 처리합니다. 또한 예외가 발생하면 메모리가 누출되지 않아 예외가 발생하지 않습니다.

+0

벡터를 사용할 수 없습니다. 숙제입니다 :) – osgx

+22

No! 배열 대신 std :: vector를 blindly로 사용하지 마십시오! 그것은 "나는 교통이 필요하다. 그래서 나는 차를 쓸 것이다"라고 말하는 것과 같다. 때로는 올바른 대답 일 수도 있지만 때로는 옆집에 가야 할 때가 있습니다. 때로는 몬트리올에서 모스크바로 갈 필요가 있습니다. 배열이 정답에 가깝지만 표준 라이브러리가 필요한 경우 std :: valarray가 원하는 것입니다. 그리고 많은 경우 어레이가 실제로 옳은 대답입니다. –

+7

@Brooks. 나는 동적으로 할당 된 배열이 std :: vector로 효율적으로 대체 될 수없는 상황을 생각할 수있다. 이것은 std :: vector __IS__ 배열 때문입니다 (유일한 차이점은 벡터가 모든 메모리 관리를 처리한다는 것입니다). 정적으로 할당 된 배열 인 경우 배열을 사용하여 작은 성능 향상을 얻을 수 있습니다. –

6
delete [] array 

이면 충분합니다.

11

그냥 delete[] array이면 충분합니다. delete[] 연산자를 사용하여 배열을 삭제하면 배열의 각 요소가 삭제된다는 보장이 있습니다.

13

일반적으로 사용자가 new/new[]으로 할당 한 것과 정확히 일치해야합니다. delete/이 경우 new[]으로 하나의 할당이 있으므로 할당 된 것을 다시 해제하려면 delete[]으로 한 번 호출해야합니다.

for 루프의 delete이 컴파일되지 않는다는 것이 올바른 방법이 아니라는 것을 나타내는 좋은 지표이기도합니다.

7

뿐만

delete [] array; 

충분하지만

for(int i=0;i<N;i++) 
    delete &array[i]; 
delete[] array; 

을 할 경우

delete &array[i]; 

가 'weren 히 일을 삭제되기 때문에 당신은 정의되지 않은 동작의 원인이 될 수 있습니다 t는 new 조작으로 리턴됩니다.

그 후속 delete[] array;은 루프에서 소멸자가 호출 된 모든 객체에 대해 소멸자를 호출합니다.

그렇게하지 마십시오.