2004년 4월 27일 화요일

getline()

GNU glibc에서만 지원하는 함수. (표준 아님)
fgets() 대신 쓸 수 있는 함수로 알아서 공간을 malloc, realloc하고 input을 한 라인 받는 다.

주의사항)
1. getline에서 사용할 buf를 미리 malloc으로 메모리를 할당하면 안됨.
왜냐하면 getline은 buf가 메모리가 할당되어있는 지 직접 알수가 없고
단지 buffer size를 기록하는 변수를 통해서만 알 수 있는 데.
malloc으로 할당하고 buffer size를 0으로 주면 기존의 주소를 버리고 malloc을 시도해서
memory leak이 발생한다.
2. getline이 사용한 buffer를 free하기 전에는 buf_len, buf_size이 scope를 벗어나 버리면 위험함
   항상 buf와 buf_len, buf_size는 같은 scope(local or global or static)에 있게 할 것.
3. buf_len, buf_size는 항상 선언시 0으로 초기화 할 것

memory leak이 났는 지 알아 내는 법)
ps, top으로 process를 지켜보다가 메모리를 너무 많이 쓰면 문제가 된다.
(메모리가 2기가를 넘게 쓰면 죽게 된다.)
=> 파일 입출력이 2기가 근처에서 죽을 때 의심해 볼만함
memory leak은 segmentation fault와는 다르기 때문에 segfault를 내지도 않고
(때로는 코드의 다른 곳에서 segfault을 낼 수도 있겠지만)
그냥 죽어버린다.
valgrind, efence 같은 tool을 활용한다.

댓글 없음:

댓글 쓰기