2013-08-02 3 views
7

모든 요소를 ​​루핑하고 각각에 delete을 호출하여 동적으로 할당 된 배열을 삭제하려고합니다.
(배열을 다른 위치로 "이동"해야하기 때문에 원래 배열을 복사 한 다음 삭제해야합니다. 그러나 각 요소를 동시에 복사하는 것보다 2 배의 시간이 걸릴 것이므로 delete을 호출하십시오. 개별적으로)동적 배열의 요소를 하나 하나씩 삭제

나는이 다음 코드 :

int main() 
{ 
    int *n=new int[2]; 
    delete n; 
    delete (n+1); 
} 

하지만 난이 분할 오류 난이를 실행할 때마다 무엇입니까 ....

이 잘 작동하지만 - :

int main() 
{ 
    int *n=new int[1]; 
    delete n; 
}  

그래서, 제 생각 엔 삭제가 어떻게 든 하나의 요소 대신 전체 배열을 삭제한다는 것입니다!

제 추측이 맞다면 아무에게도 설명해주십시오. 가능한 경우 해결 방법을 제안 하시겠습니까?

나는 개별적 요소를 삭제할 수 없습니다 우분투 13.04

+0

가장 간단한 방법은 동적 배열 대신 C++ 표준 컨테이너 (이 경우에는'std :: vector')를 사용하고 단순히 컨테이너의 erase 메소드를 사용하는 것입니다. 그러나, 다른 한편으로, 당신은 무엇을하려고합니까? 왜 요소를 하나 하나씩 삭제하고 싶습니까? – Manu343726

+0

사실 저는 다른 벡터 모양의 컨테이너를 만들려고했습니다. [그냥 std :: vectors가 두포에서 어떻게 작동하는지 더 잘 이해하기] –

+0

@Ammol C++을 배우려면? 승인. 그래서 당신의 질문은 벡터의 소멸자에 관한 것입니까? 이것이 하나의 요소를 하나씩 삭제하려고 한 이유입니다. – Manu343726

답변

7

에 GCC 4.7.3를 사용하고 있습니다. new []으로 할당 할 때는 delete []으로 할당을 해제해야합니다. 여기에서하는 일 :

int *n=new int[1]; 
delete n; // ERROR: should be delete [] 

정확하지 않습니다. 정의되지 않은 동작을 호출하고 있습니다. 그것은 순수한 기회에 의해 작동하는 것으로 보이며 신뢰할 수 없습니다. 해결 방법에 관해서는

, 문제가 무엇인지 명확하지 않다,하지만 당신은 배열을 "이동"할 경우, 당신은 단지 다른 포인터에 할당 할 수 있습니다 :

int* n=new int[2]; 
... 
int* m = n; 
n = nullptr; 
.... 
delete [] m; 
+0

예,'delete (n + 1)'에서 무엇이 잘못 되었습니까? 개별 메모리 블록이'new'만으로 할당되지 않았습니까 ?? –

+0

@AnmolSinghJaggi C++ 표준에서는 허용되지 않습니다. – juanchopanza

+3

@AnmolSinghJaggi 요점은'new []'가 전체 배열을 할당한다는 것입니다. 배열의 단일 요소를 할당 해제하는 것은 의미가 없습니다. OS가 이들과 함께 무엇을 할 수 있습니까? – juanchopanza

1

하는

을 삭제하려면
int *n=new int[2]; 

사용

delete [] n; 

코드

delete n; 

은 []을 (를) 사용하여 할당 할 때 잘못되었습니다.