문제

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

그러나 동적으로 할당 된 배열을 풀면 크기를 지정하지 않고 대신 "무료 PTR"또는 "DELETE [] PTR"만 지정합니다. 배열의 크기를 어떻게 자유롭게 알 수 있습니까? 다른 변수에 배열의 크기를 저장하지 않기 위해 동일한 체계를 사용할 수 있습니까?

감사!

도움이 되었습니까?

해결책

예 이것이 진실입니다.

delete 메모리 청크의 크기를 알고 있습니다 new 청크에 추가 정보를 추가합니다 (보통 영역이 사용자에게 반환되기 전), 크기가 포함 된 다른 정보와 함께 추가 정보를 추가합니다. 이것은 모두 구현에 따라 다르며 코드에서 사용해서는 안됩니다.

마지막 질문에 답하기 위해 : 아니 - 우리는 그것을 사용할 수 없습니다 - 그것은 플랫폼과 컴파일러 의존적 인 구현 세부 사항입니다.


예를 들어, k & r2에서 시연 된 샘플 메모리 할당 자에서, 이것은 할당 된 각 청크 앞에 배치 된 "헤더"입니다.

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 할당 된 블록의 크기입니다 (그런 다음 사용합니다. free, 또는 delete).

다른 팁

재미있는 점은 역사적으로 그랬다는 것입니다 delete [20] arr; 그대로 arr = new int[20]. 그러나 연습은 크기에 대한 정보가 할당 기에 의해 고통스럽게 저장 될 수 있음을 증명했으며, 그것을 사용하는 대부분의 사람들은 어쨌든 그것을 저장했기 때문에 표준에 추가되었습니다.

더 재미 있고 거의 알려지지 않은 것은이 "확장 된 삭제 구문"이 실제로 몇 개의 C ++ 컴파일러에 의해 지원된다는 사실입니다 (C ++ 98 표준에도 불구하고 잘못 되었음에도 불구하고).

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

그러나 이것에 대한 슬픈 부분은 자신의 용도로 전달 된 크기를 검색하는 표준 정보 방법이 없다는 것입니다.-/

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

그래 그건 사실이야. 이것이 왜 이것을 직접 처리하지 않고 대신 표준 컨테이너를 사용해야하는지의 일부입니다. 이를 다루는 것이 합리적 인 유일한 시간은 컨테이너를 직접 구현하기로 결정한 경우 (이 경우 일반적으로 컨테이너 구현에서 크기 정보를 추적 할 것입니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top