2013-05-18 1 views

답변

3

아니, delete [] 할당 해제 모든 메모리만큼 당신이 new []에 의해 반환 된 delete []에 같은 주소를 통과 new []에 의해 할당을 주셔서 감사합니다.
메모리에 배치 된 내용에 관계없이 할당 된 메모리 양을 올바르게 기억합니다.

+0

'new []'와 'delete []'가 오버로드되지 않았 으면 – SomeWittyUsername

1

Delete는 문자열을 삭제하는 동안 "\ n"을 찾지 않습니다.

대신 컴파일러는 문자열에 메모리 청크를 할당하는 동안 "\ n"을 찾습니다.

그러므로 myChar와 myChar2를 모두 삭제하는 것은 특정 포인터에 대해 실제로 할당 된 메모리 청크의 크기를보고 똑같은 방식으로 작동합니다. 이것은 당신의 상황에서 메모리 누출을 제거합니다.

1

이것은 이해가 필요한 C++의 기본 요소입니다. 그 이유는 혼란을 야기합니다. 상기 예을 봐 :

두 포인터가 동일한 유형을 가지고, 당신은 그들이 가리키는 된 개체 해제하기 위해 다른 방법을 사용한다는 사실에도 불구하고
char* myChar1 = new char[20]; 
char* myChar2 = (char*)malloc(20); 

:

delete [] myChar1; 
free(myChar2); 

주 당신 경우 수행 그 후

char *tmp = myChar1; 
myChar1 = myChar2; 
myChar2 = myChar1; 

당신이 필요합니다

delete [] myChar2; 
free(myChar1); 

개체 자체를 추적해야합니다 (예 : 어떻게 할당되었는지),이 객체에 대한 포인터를 유지하는 장소가 아닙니다. 이 객체에 대한 정보를 저장하는 장소가 아니라 놓을 객체를 놓습니다.

1

삭제 [] 사용자가 실제로 사용한 3 + 1뿐만 아니라 20 개의 문자를 모두 할당 해제합니다.

1
char* myChar=new char[20]; // you allocate 20 space for 20 chars 

      +-----------------+ 
myChar -> | x | x | ... | x | // x = uninitialized char 
      +-----------------+ 

char* myChar2="123"; 

      +----------------+ 
myChar2 -> | 1 | 2 | 3 | \0 | // myChar2 points to string 
      +----------------+ 

strcpy(myChar, myChar2); // copy string to 20 char block 
// strcpy copies char by char until it finds a \0 i.e. 4 chars 
// in this case 

      +----------------------------------+ 
myChar -> | 1 | 2 | 3 | \0 | x | x | ... | x | 
      +----------------------------------+ 
// note that characters after the string 123\0 are 
// still uninitialized 

delete[] myChar; 

// the whole 20 chars has been freed