2016-08-24 1 views
2

이 함수는 스트림과 관련된 스트림 버퍼를 변경하는데 사용될 수있다rdbuf (...)는 가리키는 버퍼를 소유 한 포인터를 반환합니다?

streambuf* std::basic_ios::rdbuf (streambuf* sb);

STL <ios> 라이브러리 함수에게있다. 이것을 사용하면 이전에 사용하던 streambuf에 대한 포인터를 반환합니다. 누가 포인터를 소유하고 있는지 또는 포인터의 수명이 누구인지는 분명하지 않습니다. 표준 (27.5.5.3/5)은 간단히 말해서

을 반환합니다. 이전 값은 rdbuf()입니다.

매우 유익하지 않습니다. 이 포인터의 유효 기간에 대한 보장이 있습니까? 포인터를 호출하면 코드 delete을 처리해야합니까?

답변

4

버퍼는 원래 스트림 객체에 버퍼를 설치 한 사람이 소유합니다. 스트림 객체는 내부 버퍼와 함께 제공되며 기본 생성 된 스트림 객체는 기본적으로이 객체를 사용합니다. 코드가 명시 적으로 rdbuf() 방법을 사용하여 기본이 아닌 버퍼를 설치하지 않는

그래서, 대답은 버퍼 스트림 객체가 존재하는만큼 유효한 것입니다.

버퍼를 설치하지 않은 경우 분명히 delete이 아닙니다.

+0

감사합니다. 어딘가에서 표준에 명시된 동작입니까? – Mohan

+0

명시 적으로. rdbuf()가 리턴 한 버퍼의 소유자가 지정되지 않았습니다. 분명히 발신자가 소유하지 않으면 삭제할 수 없습니다. –

+0

또한 중요 : 버퍼를 설치하고 그것을 'new'로 할당 한 경우에도 스트림이 끝날 때까지 '삭제'하지 마십시오. – MSalters

관련 문제