c언어 free 관련해서 질문이 있습니다.

bao의 이미지

구조체 B {
...
...
}

구조체 A {
....

char * buf

....
}

main ()
{
A a;
B *b = (구조체 *B)malloc(sizeof(구조체 B));

a.buf = (char *) b;

}

위에 처럼 B 구조체의 정보를 A구조체의 char *에 저장을 해놓으려고 합니다. (char * 로 한 이유는 사실 아무 데이터 형이든 상관이 없지만 여기 buf에 다른 여러가지 구조체 정보가 상황에 따라 올수가 있어 그냥 char *로 하였습니다.)

이런 상황에서 free를 할때

free(buf)를 해도 메모리 누수가 생기지 않는지 궁금합니다.
생긴다면 어떻게 해야 하는지와... 메모리 누수가 생기지 않는다면 왜 안생기는지가 궁금합니다..

jachin의 이미지

일단, 말씀하신 예제에서는 메모리 누수가 일어나지는 않습니다. 이미 b 포인터가 힙을 가리키고 있고, a.buf 만 free( ) 한다고 하더라도, main 함수에서 b 포인터의 존재가 명시되지 않았다면 모르겠지만, 명시되어 있는 상태에서는 (그리고 malloc을 호출한 상태에서는) 발생하지는 않을 겁니다. 커널에서 알고 있기 때문이지요.

원하시던 예제는 이런 예제가 아닐까 생각합니다.
https://en.wikipedia.org/wiki/Memory_leak#A_simple_example_in_C