저는 Linux만 사용하지만 이것이 무엇을 의미하는지 알고 싶습니다.
~에서리눅스 프로그래밍 인터페이스:
할당된 메모리 블록을 사용하거나
memalign()
여유posix_memalign()
공간을 사용해야 합니다free()
.일부 UNIX 구현에서는 구현이 할당된 메모리 블록을 사용한 다음 적절한 정렬을 통해 해당 블록 내의 주소에 대한 포인터를 반환하기 때문에
free()
할당된 메모리 블록을 통해 호출하는 것이 불가능합니다 . glibc의 구현에는 이러한 제한이 적용되지 않습니다.memalign()
memalign()
malloc()
memalign()
에서 man memalign
:
posix_memalign()
POSIX 에서는 얻은 메모리를 해제할 수 있어야 합니다free(3)
. 일부 시스템은memalign()
or 를 사용하여 할당된 메모리를 회수할 수 없습니다valloc()
(예를 들어free(3)
에서 얻은 포인터 만 전달되는malloc(3)
반면 호출한 다음 얻은 값을 정렬memalign()
하기 때문입니다).malloc(3)
glibc 구현을 사용하면 이러한 함수에서 얻은 메모리를 회수할 수 있습니다free(3)
.
나는 메모리 정렬에 대해 잘 모르고 이해하지 못합니다.예를 들어, 얻은 값을 memalign()
호출 한 다음 정렬합니다.malloc(3)
".
여기서 무슨 일이 일어나고 있고 무엇이 잘못되었는지 말해 줄 수 있는 사람이 있나요 free()
?
답변1
posix_memalign
이름에서 알 수 있듯이 POSIX에 의해 정의되었기 때문에 사용해야 합니다 . 질문이 있는 경우 memalign
다음을 참조하세요.Solaris 10 메모리 할당 기능 매뉴얼 페이지:
free()에 대한 인수는 이전에 malloc(), calloc() 또는 realloc()에 의해 할당된 블록에 대한 포인터입니다. free()가 실행된 후 응용 프로그램에서 추가 할당을 위해 공간을 사용할 수 있지만 시스템에 반환되지는 않습니다. 애플리케이션이 종료될 때만 메모리가 시스템에 반환됩니다. ptr이 널 포인터이면 아무 작업도 발생하지 않습니다. free()에 난수를 전달하면 결과는 정의되지 않습니다.
설명에는 배포에 free()
대한 언급조차 없습니다 memalign
.
예를 들어, memalign()은 malloc(3)을 호출한 다음 얻은 값을 정렬합니다.
다음 구현은 주어진 설명의 예입니다.
void *memalign(size_t alignment, size_t size)
{
void *mem;
uintptr_t uip_mem, uip_align;
// fail if alignment is smaller than sizeof(void*) or not a power of two
if (alignment < sizeof(void*) || alignment & (alignment - 1)) {
errno = EINVAL;
return NULL;
}
// allocate alignment extra bytes to prevent heap overflow
mem = malloc(size + alignment);
if (mem == NULL)
return NULL;
uip_mem = (uintptr_t) mem;
uip_align = (uintptr_t) alignment;
// align up returned address
return (void*) ((uip_mem + uip_align - 1) & -uip_align);
}
바라보다이 위키피디아 페이지정렬에 대한 추가 정보. 이전 구현은 malloc
정렬에 따라 반환된 주소와 동일한 주소를 반환할 수도 있고 반환하지 않을 수도 있습니다 . 반환된 주소는 호출에 의해 반환된 주소와 정확히 동일하지 않을 수 있으므로 (또는 다른 할당 함수) 변경되지 않은 값을 반환할 것으로 malloc
예상하기 때문에 안전하게 전달할 수 없습니다 .free
malloc