안녕하세요~
C 프로그래밍의 가장 기본이 되는것에 대하여 질문을 올리는데욧!!!
alloc계열 함수로 메모리를 할당하면 4byte (32bit OS경우)에 저장한 크기를 저장 후, 할당된 크기를 메모리 allocation하고,
할당한 메모리 시작 주소를 return하고,
free시 alloc함수에서 return포인터를 집에 넣으면 4byte (32bit OS경우) 만큼 앞으로 이동 후, 크기를 읽어 그 크기만큼
메모리를 해제 시키는것으로 알고 있습니다.
그런데 만약 alloc함수가 리턴한 값을 포인터를 이동시켜서 처리 후, 잡고 있는 메모리의 중간에 위치한 포인터를 free함수로
집어 넣어 free함수로 메모리 해제를 시도할경우,
1. free는 제대로 실행되는건가요?
2. 전부 해제 시킬수있는건가요?
ps. 포인터를 끝으로 이동 시키고 메모리 해제를 할경우 "세그먼트 폴트 에러"가 나오는것은 확인하였습니다.
중간에 집어 넣으면 에러 없이 동작하는거같은데, 이론과 달라 뭔가 오동작을 할것만 같습니다.
고수님들의 가르침을 부탁드립니다 ^^
.
왜 그러한 작업을 하시나요?
이미 잘(?) 정의된 interface가 있는데 이를 올바르게 이용하지 않고
일부러 잘못된 방식으로 접근하게 된다면
올바른 동작을 보장받을 수 있을리가 없겠지요..
제가 알기론 (glibc에서) 1, 2번 모두 '아니오'입니다.
실제 동작은 해당 memory chunk의 metadata 부분에 어떤 값이 저장되어 있느냐에 따라 달라지겠지만
잘해야 segmentation fault, 아니면 heisenbug의 원인이 될 뿐입니다.