2010-01-09 8 views
14

동적으로 할당 된 배열의 시작 주소에 할당 된 포인터에 배열의 크기 정보가 없다는 것이 사실입니까? 따라서 나중에 포인터를 통해 배열을 처리하기 위해 크기를 저장하기 위해 다른 변수를 사용해야합니다.동적으로 할당 된 배열의 크기

그러나 동적으로 할당 된 배열을 해제 할 때는 크기를 지정하지 않고 단순히 "free ptr"또는 "delete [] ptr"로 지정합니다. 배열의 크기를 어떻게 알 수 있습니까? 아니면 삭제할 수 있습니까? 배열의 크기를 다른 변수에 저장하는 것을 피하기 위해 동일한 체계를 사용할 수 있습니까?

감사합니다.

답변

18

예, 그렇습니다.

delete은 다른 정보와 함께 그 크기를 포함하는 여분의 정보를 청크에 추가하기 때문에 (보통 사용자에게 반환 된 영역 전에) 메모리 조각의 크기를 알고 있습니다. 이것은 모두 구현에 매우 중요하며 코드에서 사용해서는 안됩니다.

마지막 질문에 대한 답변 : 아니요 - 우리는 사용할 수 없습니다 - 고도의 플랫폼 및 컴파일러에 의존적 인 구현 세부 사항입니다.

typedef long Align; /* for alignment to long boundary */ 

union header { /* block header */ 
    struct { 
    union header *ptr; /* next block if on free list */ 
    unsigned size; /* size of this block */ 
    } s; 

    Align x; /* force alignment of blocks */ 
}; 

typedef union header Header; 

size 할당 된 블록의 크기 (즉 같습니다


예를 들어, K & R2에서 설명한 샘플 메모리 할당, 이것은 각각의 할당 된 청크 전에 배치 된 "헤더"인 다음 free 또는 delete으로 사용).

+1

참고 그 시점에서 할당 된 블록의 크기 할당 자 구현보기는 사용자가 요청한 크기보다 클 수 있습니다. –

+0

또한 원시 기본 블록의 크기를 초과하여 유형 T에 소멸자가있는 경우 시스템은 소멸자를 호출 할 수 있도록'new T [n]'_에 전달 된'n '을 저장해야합니다. 'delete []'가 호출됩니다. 물론 'n'을 저장하는 방법과 위치는 원시 블록 크기의 저장과 마찬가지로 구현에 따라 다릅니다. –

3

배열에 배열의 크기가 포함되어 있지 않다면 나중에 해당 정보를 저장해야합니다. delete 또는 free을 통해 배열을 삭제하면 전달 된 할당 된 메모리에 대한 포인터입니다. 사용 된 메모리 관리자 (시스템 또는 사용자 정의에 의한 새 정의와 삭제에 대한 사용자 지정)는 해제 된 메모리 영역을 알고 있으며이를 추적합니다. 그것이 의미가 있기를 바랍니다.

2

네, 맞습니다. 이것은 직접적으로 직접 처리하지 않아야하는 이유 중 일부이며 대신 표준 컨테이너를 사용합니다. 이를 처리하는 것이 의미있는 유일한 시간은 컨테이너를 직접 구현하는 경우입니다 (이 경우 컨테이너의 구현에서 크기 정보를 일반적으로 추적 할 것입니다).

7

재미있는 점은 역사적으로는 arr = new int[20] 인 것처럼 delete [20] arr;이었습니다. 그러나 실제로 크기에 대한 정보가 할당 자에 의해 쉽게 저장 될 수 있고, 그것을 사용하는 대부분의 사람들이 어쨌든 그것을 저장 했으므로, 표준에 추가되었습니다.

더 재미 있고 거의 알려지지 않은 사실은이 "확장 삭제 구문"이 사실 C++ 98 표준에 맞지 않더라도 일부 C++ 컴파일러에서 실제로 지원된다는 사실입니다. 그것을 요구하십시오.

int* arr = new int[20]; 
delete [20] arr; 

이것에 대해 슬픈 부분은 모든 그러나 그 전달 자신의 사용 크기 검색 할 표준 준수 방법이 없다,있다 : -/

+0

"지원"될 수도 있습니다 - C++ 표준의 일부가 아닙니다. –

+0

사실, 나는 나의 대답을 조금 확장했다. 사용 가능한 표준 문서가 "기능"인 문서가 있는지 궁금합니다. –

관련 문제