2009-08-20 2 views
5

4096 바이트를 보유하도록 할당 된 포인터가 있다고 가정 해 봅니다. 어떻게 C에서 마지막 1024 바이트의 할당을 해제합니까? C++에서는 어떨까요? 대신에 바이트의 첫 번째 바이트 인 바이트의 할당을 해제하고 나머지는 그대로 유지하려면 어떻게해야합니까? 중간에서 할당을 해제하는 것은 어떨까요 (이것은 할당 해제 된 영역 앞뒤에 두 개의 포인터로 분할해야하는 것처럼 보입니다).C 및 C++ : 할당 된 포인터의 부분 해제

+0

잘 모르겠지만 올바른 크기의 "가짜"포인터를 사용하거나 삭제하거나 해제하려면 트릭을해야합니다. 포인터가 2 개 이상 필요합니다. – claf

+1

@ 클라 페리. 그건 정의되지 않은 행동입니다. malloc/realloc에서 반환 된 포인터 만 free() 할 수 있습니다. 그렇지 않으면 free()가 얼마만큼 자유롭게하는지 알 수 있습니까? – Roddy

+0

@roddy : oups 맞아요 :) – claf

답변

2

, 당신은 reallocm 바이트 (여기서 m < n) 따라서 마지막 n-m 바이트를 버릴 수 있습니다.

처음부터 버리려면 malloc 새 작은 버퍼와 memcpy 원하는 바이트 수를 입력 한 다음 free 원본을 입력합니다.

후자의 옵션은 C++ newdelete을 사용하여 사용할 수도 있습니다. 첫 번째 realloc 사례를 에뮬레이션 할 수도 있습니다.

+1

"malloc/memcpy/free"는 realloc을 내부적으로 구현하는 방법입니다. – Roddy

+1

realloc은 보통 (동일한) 첫 번째 부분을 반환하지만 realloc의 공식 요구 사항에 동의합니까? 여기서 데이터를 새로운 위치로 옮길 수있는 구현이라고 생각합니다. –

+0

할당의 히스토리 패턴이 추적되는 지능형 재 할당 구조를 상상해보십시오 ... 4096 바이트에 대한 최근 할당 요청이있는 경우 축소 블록을 다른 곳으로 이동하여이 4K 블록을 해제하는 것이 좋습니다. 이 경우 주소가 변경됩니다. 그리고 realloc은 새로운 메모리 영역에 포인터를 반환하므로 프로그래머는 그것을 사용해야합니다. 그것은 변화 여부. – xcramps

1

realloc()을 사용하여 짧게 만들 수 있습니다. 나는 나머지는 가능하다고 생각하지 않는다. 당신이 malloc을 ated 메모리의 n 바이트가있는 경우

1

realloc()을 사용하여 메모리를 더 짧게 만들 수 있습니다. 일부 구현에서는 이러한 호출이 실제로 아무것도 수행하지 않습니다. 블록의 첫 번째 비트를 해제하고 마지막 비트를 유지할 수 없습니다.

이러한 종류의 기능이 필요할 경우 더 복잡한 데이터 구조를 사용해야합니다. 배열은 모든 프로그래밍 문제에 대한 정답이 아닙니다.

+0

저는 메모리 시스템을 구현하고 있습니다. 가능한 한 낮은 수준의 액세스는 가능한 한 계속 휴대 할 수 있습니다. – Imagist

1

http://en.wikipedia.org/wiki/New_(C%2B%2B)

요약 : C의 realloc과 대조적으로, 직접 새로운 [] 메모리 할당을 재 할당하는 것은 불가능하다. 을 확장하거나 블록 크기를 줄이려면 은 적절한 크기의 새 블록을 할당하고 이전 메모리를 복사하고 은 이전 블록을 삭제해야합니다. C++ 표준 라이브러리는 std :: vector 템플릿에서 을 확장하거나 축소 할 수있는 동적 배열을 제공합니다.

12

메모리 관리를 두 번째 추측하지 마십시오. 그것은 당신이 당신이 달성 할 수있는 유일한 일이 지난 1K

그러나
char * foo = malloc(4096); 

foo = realloc(foo, 4096-1024); 

'할당 해제'에 대한 첫 번째 시나리오

을 ;-)보다 일반적으로 영리이다,이 경우에도, 그 어떠한 보증도 "foo는이 없다 "변경되지 않습니다. 전체 4K가 해제되고 realloc()이 다른 곳으로 메모리를 이동할 수 있으므로 보유 할 수있는 포인터가 무효화 될 수 있습니다.

이것은 C와 C++ 모두에 유효합니다. 그러나 C++에서 malloc()을 사용하면 코드가 나 빠지고 대부분의 사람들은 new()을 사용하여 저장소를 할당해야합니다. 그리고 new()로 할당 된 메모리는 재 할당 (realloc) 할 수 없으며, 최소한 이식 가능한 방법으로는 사용할 수 없습니다.STL 벡터는 C++에서 훨씬 더 나은 접근 방법입니다.

5

"4096 바이트를 저장하도록 할당 된 포인터"가 없으므로 할당 된 4096 바이트 블록을 가리키는 포인터가 있습니다.

블록에 malloc()이 할당 된 경우 realloc()을 사용하면 블록 크기를 줄이거 나 늘릴 수 있습니다. 그러나 블록의 시작 주소는 반드시 동일하게 유지되지는 않습니다.

malloc '메모리 블록의 시작 주소를 변경할 수 없습니다. 두 번째 시나리오에서 묻는 내용입니다. malloc 블록을 분할하는 방법도 없습니다.

malloc/ calloc/ realloc/ free API의 제한 사항입니다 - 그리고 구현은 시작 주소를 이동 만들 것 즉시 시작 주소 이전 할당에 대한 기록 정보를 유지하는 (예를 들어, 이러한 제한에 의존 할 수 어려운)

지금, malloc 밖에 만 할당하지 않습니다 -. 플랫폼 또는 라이브러리는 다른 사람을 제공 할 수 있습니다, 또는 당신은 malloc, mmap, VirtualAlloc 또는 일부를 통해 시스템에서 메모리를 얻을 수있는 (자신을 작성할 수 다른 메커니즘) 원하는대로 어떤 방식 으로든 프로그램에 건네줍니다.

C++의 경우 std::malloc과 함께 메모리를 할당하면 위의 정보가 적용됩니다. newdelete을 사용하는 경우 저장소를 할당하고 개체를 구성하기 때문에 할당 된 블록의 크기를 변경하는 것이 의미가 없습니다. C++의 개체는 고정 크기입니다.