2011-09-20 6 views
0

가능한 중복 :
Is there any way to determine the size of a C++ array programmatically? And if not, why?C++에서 동적으로 할당 된 배열의 길이를 얻는 방법이 있습니까?

, 어떻게 C++의 delete 연산자 무료로 얼마나 많은 요소를 알고하지 않습니다 만약 내가, C++에서 동적으로 할당 된 배열의 길이를 얻을 수 있습니다.

포럼을 검색 한 결과, 동적으로 할당 된 배열의 경우 길이가 배열의 머리글 앞에있는 4 바이트 또는 다른 위치에 저장된다는 것을 알았습니다. 이 값을 얻으려면 어떻게해야합니까?

+0

@larsmans 네, 맞습니다. 내가 제공 한 링크를 참조 할 것입니다. – cheng

답변

1

간단히 말해서, 당신은 할 수 없습니다. 구현 정의이므로 액세스 할 수 없습니다. 당신은, 그러나, (그리고 필요) 변수에 저장하거나, 등 크기를 제어 일부 유형의 같은 std::vector, std::string을 사용할 수 있습니다

은 C++ 라이브러리의 구현이 것을 가지고 있기 때문에 delete[] 운영자는 알고있다 정보를 제공하지만 C++ 프로그램에서는 사용할 수 없습니다. 일부 구현에서는 포인터의 실제 주소보다 약간의 바이트에 저장되지만, 다시 알 수는 없습니다.

+0

답변 해 주셔서 감사합니다. 그렇다면 컴파일러는 delete [] 할이 값을 어떻게 알 수 있습니까? 컴파일러가이 값에 액세스 할 수있는 경우 컴파일러에서 사용자에게이 값을 숨기는 이유는 무엇입니까? – cheng

+0

그것은 컴파일러가 아니라 라이브러리입니다. 클래스의'private' 변수를 숨기는 것과 같은 방법으로'delete []'의 코드에 숨겨져 있습니다. 요약 : 액세스 할 수 없습니다. –

2

헤더 앞의 4 바이트는 확실히 사용하지 말아야 할 구현 세부 사항입니다. 배열의 크기를 알아야 할 경우 std :: vector를 사용하십시오.

1

수 없습니다. 그러나 std::vector<T> v(N)new T[N]과 거의 동일하며 v.size()을 제공하므로 수동 배열을 사용하는 데 큰 이유가없는 한 실제로 사용해야합니다.

0

또 다른 옵션은 ([] 새로운 연산자 오버로딩하고 신경 또는 #DEFINE의의 malloc mymalloc와 상황에 따라 #DEFINE 무료 myfree을하고 어떤 클래스에 대해 삭제 []) 자신의 할당을 정의하는 것입니다. 배열 길이를 저장하는 위치는 당신에게 달려 있지만 일반적으로 배열의 시작 전에 여분의 바이트를 할당합니다 (메모리 정렬에 적합한 양 (일반적으로 4, 8 또는 16)). 거기에 길이를 저장합니다.

관련 문제