그래서 libc의 stdio 부분이 어떻게 구현되는지 파헤쳐 봤고 또 다른 질문을 발견했습니다. I는 다음에 볼 man setvbuf
상대 :누가 무료로 setvbuf 버퍼를 사용합니까?
제 I/O 동작에 파일을 발생의 malloc (3)라고하고, 버퍼가 얻어진다.
사용자가 실제로 사용하지 않으면 프로그램에 I/O 용으로 malloc
이 없어야합니다. 내 직감에 대한 반응은 libc가 여기에 자신의 혼란을 치울 것입니다. valgrind가 메모리 누수를보고하지 않기 때문에 나는 그럴 수 있다고 가정 할 수 있습니다. 그들은 물론 더러운 것을 수행하고 malloc
을 통해 직접 할당하지 않을 수 있습니다. 그러나 문자 그대로는 malloc
을 사용한다고 가정합니다.)
그러나, 당신은 ... 너무
int main() {
char *p = malloc(100);
setvbuf(stdio, p, _IOFBF, 100);
puts("hello world");
}
오, 아니, 메모리 누수가 자신의 버퍼를 지정할 수 있습니다! valgrind가 그것을 확인합니다. 그래서 stdio가 버퍼를 할당 할 때마다 자동으로 삭제 될 것입니다 (늦어도 프로그램 종료시에, 아마도 스트림 닫기에있을 것입니다). 하지만 버퍼를 명시 적으로 지정하면 직접 버퍼를 정리해야합니다.
캐치가 있습니다. BUF 포인트는 여전히 시간 스트림에 의해 존재하는 그 공간 또한 프로그램 종료에 을 발생하는 닫혀 있는지
당신은 확인해야합니다 : 남자 페이지에는이 말했다. 예를 들어, 다음은 올바르지 않습니다.
이제 표준 스트림에 대해 흥미롭게 보입니다. 프로그램 종료시 닫혀 있기 때문에 수동으로 할당 된 버퍼를 어떻게 적절하게 정리합니까? 나는 파일 구조체 내부에 "나는 플래그를 닫을 때이 정리"상상할 수있는,하지만 난 이런 식으로 뭔가를하고이 권리를 읽으면 때문에 털이 얻을 :
setvbuf(stdout, 0, _IOFBF, 0);
printf("hello ");
setvbuf(stdout, 0, _IOLBF, 0);
printf("world\n");
표준 라이브러리에 의해 2 개 할당을 야기의 때문에 이 문장 :
인수 buf가 NULL이면, 모드 만 영향을받습니다. 새 버퍼는 이 다음 읽기 또는 쓰기 작업에 할당되고 작업을 수행합니다.
편집 : 내 질문에 대한 추가 정보. 내가 실제로 에 그것을 사용한다면 free
setvbuf
으로 전달하는 모든 버퍼가 free
에 전달해야한다는 것이 분명하기 때문에? 프로그램 끝까지 살아 있어야합니다. 내가 생각할 수있는 가장 좋은 방법은 fclose(stdout)
입니다. 그런 다음 사람들을 언급 한 것처럼 정적 버퍼를 사용하거나 해제하십시오. 그것이 어색한 디자인 결정처럼 보이기 때문에 나는 묻는다.(적어도 내 시스템에서) man page에서 또한
페이지에 대한 링크 된 답변이 업데이트되었습니다. OS X이지만, 맨 페이지는 FreeBSD (http://www.freebsd.org/cgi/man.cgi?query=setvbuf)에서 제공됩니다. – outis
free()로 free'd해서는 안되는 정적 버퍼를 제공 할 수 있기 때문에 상황이 어떻게 될지 알기가 어렵습니다. –
@ Neeil : 실제로 stdlib이 스트림에서 할당 한 버퍼를 얻을 수있는 방법이 없으므로 stdlib에 메모리 누수가 있는지 궁금합니다. –