4096 바이트를 보유하도록 할당 된 포인터가 있다고 가정 해 봅니다. 어떻게 C에서 마지막 1024 바이트의 할당을 해제합니까? C++에서는 어떨까요? 대신에 바이트의 첫 번째 바이트 인 바이트의 할당을 해제하고 나머지는 그대로 유지하려면 어떻게해야합니까? 중간에서 할당을 해제하는 것은 어떨까요 (이것은 할당 해제 된 영역 앞뒤에 두 개의 포인터로 분할해야하는 것처럼 보입니다).C 및 C++ : 할당 된 포인터의 부분 해제
답변
, 당신은 realloc
m
바이트 (여기서 m
< n
) 따라서 마지막 n-m
바이트를 버릴 수 있습니다.
처음부터 버리려면 malloc
새 작은 버퍼와 memcpy
원하는 바이트 수를 입력 한 다음 free
원본을 입력합니다.
후자의 옵션은 C++ new
및 delete
을 사용하여 사용할 수도 있습니다. 첫 번째 realloc
사례를 에뮬레이션 할 수도 있습니다.
"malloc/memcpy/free"는 realloc을 내부적으로 구현하는 방법입니다. – Roddy
realloc은 보통 (동일한) 첫 번째 부분을 반환하지만 realloc의 공식 요구 사항에 동의합니까? 여기서 데이터를 새로운 위치로 옮길 수있는 구현이라고 생각합니다. –
할당의 히스토리 패턴이 추적되는 지능형 재 할당 구조를 상상해보십시오 ... 4096 바이트에 대한 최근 할당 요청이있는 경우 축소 블록을 다른 곳으로 이동하여이 4K 블록을 해제하는 것이 좋습니다. 이 경우 주소가 변경됩니다. 그리고 realloc은 새로운 메모리 영역에 포인터를 반환하므로 프로그래머는 그것을 사용해야합니다. 그것은 변화 여부. – xcramps
realloc()을 사용하여 짧게 만들 수 있습니다. 나는 나머지는 가능하다고 생각하지 않는다. 당신이 malloc
을 ated 메모리의 n
바이트가있는 경우
realloc()을 사용하여 메모리를 더 짧게 만들 수 있습니다. 일부 구현에서는 이러한 호출이 실제로 아무것도 수행하지 않습니다. 블록의 첫 번째 비트를 해제하고 마지막 비트를 유지할 수 없습니다.
이러한 종류의 기능이 필요할 경우 더 복잡한 데이터 구조를 사용해야합니다. 배열은 모든 프로그래밍 문제에 대한 정답이 아닙니다.
저는 메모리 시스템을 구현하고 있습니다. 가능한 한 낮은 수준의 액세스는 가능한 한 계속 휴대 할 수 있습니다. – Imagist
http://en.wikipedia.org/wiki/New_(C%2B%2B)
요약 : C의 realloc과 대조적으로, 직접 새로운 [] 메모리 할당을 재 할당하는 것은 불가능하다. 을 확장하거나 블록 크기를 줄이려면 은 적절한 크기의 새 블록을 할당하고 이전 메모리를 복사하고 은 이전 블록을 삭제해야합니다. C++ 표준 라이브러리는 std :: vector 템플릿에서 을 확장하거나 축소 할 수있는 동적 배열을 제공합니다.
메모리 관리를 두 번째 추측하지 마십시오. 그것은 당신이 당신이 달성 할 수있는 유일한 일이 지난 1K
그러나char * foo = malloc(4096);
foo = realloc(foo, 4096-1024);
'할당 해제'에 대한 첫 번째 시나리오
을 ;-)보다 일반적으로 영리이다,이 경우에도, 그 어떠한 보증도 "foo는이 없다 "변경되지 않습니다. 전체 4K가 해제되고 realloc()이 다른 곳으로 메모리를 이동할 수 있으므로 보유 할 수있는 포인터가 무효화 될 수 있습니다.
이것은 C와 C++ 모두에 유효합니다. 그러나 C++에서 malloc()을 사용하면 코드가 나 빠지고 대부분의 사람들은 new()을 사용하여 저장소를 할당해야합니다. 그리고 new()로 할당 된 메모리는 재 할당 (realloc) 할 수 없으며, 최소한 이식 가능한 방법으로는 사용할 수 없습니다.STL 벡터는 C++에서 훨씬 더 나은 접근 방법입니다.
"4096 바이트를 저장하도록 할당 된 포인터"가 없으므로 할당 된 4096 바이트 블록을 가리키는 포인터가 있습니다.
블록에 malloc()
이 할당 된 경우 realloc()
을 사용하면 블록 크기를 줄이거 나 늘릴 수 있습니다. 그러나 블록의 시작 주소는 반드시 동일하게 유지되지는 않습니다.
malloc
'메모리 블록의 시작 주소를 변경할 수 없습니다. 두 번째 시나리오에서 묻는 내용입니다. malloc
블록을 분할하는 방법도 없습니다.
이
는malloc
/
calloc
/
realloc
/
free
API의 제한 사항입니다 - 그리고 구현은 시작 주소를 이동 만들 것 즉시 시작 주소 이전 할당에 대한 기록 정보를 유지하는 (예를 들어, 이러한 제한에 의존 할 수 어려운)
지금, malloc
밖에 만 할당하지 않습니다 -. 플랫폼 또는 라이브러리는 다른 사람을 제공 할 수 있습니다, 또는 당신은 malloc
, mmap
, VirtualAlloc
또는 일부를 통해 시스템에서 메모리를 얻을 수있는 (자신을 작성할 수 다른 메커니즘) 원하는대로 어떤 방식 으로든 프로그램에 건네줍니다.
C++의 경우 std::malloc
과 함께 메모리를 할당하면 위의 정보가 적용됩니다. new
및 delete
을 사용하는 경우 저장소를 할당하고 개체를 구성하기 때문에 할당 된 블록의 크기를 변경하는 것이 의미가 없습니다. C++의 개체는 고정 크기입니다.
- 1. C# 메모리 할당 및 할당 해제 패턴
- 2. 복사 포인터의 할당 해제 처리하는 방법
- 3. 목표 C - 할당 해제 된 변수
- 4. C *에서 char * 할당 및 해제
- 5. 포인터의 C++ 배열
- 6. 메모리 할당 및 해제
- 7. 할당 및 해제 문제
- 8. NSUserDefaults 및 할당 해제 된 인스턴스의 문제
- 9. objective-c 싱글 톤 메모리 할당 해제
- 10. 포인터의 부분 특수화
- 11. C++에서 RAII 및/또는 안전한 할당 해제 공식 처리
- 12. void 포인터의 배열에 할당 된 메모리를 해제합니다.
- 13. 포인터의 Objective-C 사용
- 14. 가상 포인터의 크기 -C++
- 15. C++ 포인터의 차이 ->
- 16. C 포인터의 문제점
- 17. 포인터의 포인터로의 C++ 벡터
- 18. 리소스 할당/할당 해제
- 19. NSFetchedResultsController 할당 해제 된 인스턴스
- 20. 스택 메모리 할당 및 할당 해제 메커니즘
- 21. 리소스 할당 및 자동 할당 해제
- 22. C++ 정적 변수 해제
- 23. 개체 포인터의 배열 만들기 C++
- 24. 수동으로 NSValue 할당 해제
- 25. iphone 메시지는 할당 해제 된 인스턴스
- 26. Objective-C :보기 해제 지점
- 27. 부분 빈 직렬화 및 직렬화 해제 + 병합
- 28. .NET에서 리소스 해제 C#
- 29. Qt 위젯 객체 만들기 및 할당 해제
- 30. iPhone - 새로운보기와 할당 해제 된 객체로드하기
잘 모르겠지만 올바른 크기의 "가짜"포인터를 사용하거나 삭제하거나 해제하려면 트릭을해야합니다. 포인터가 2 개 이상 필요합니다. – claf
@ 클라 페리. 그건 정의되지 않은 행동입니다. malloc/realloc에서 반환 된 포인터 만 free() 할 수 있습니다. 그렇지 않으면 free()가 얼마만큼 자유롭게하는지 알 수 있습니까? – Roddy
@roddy : oups 맞아요 :) – claf