2010-05-12 5 views
64

나는 최근에 std::strstream이 (가) std::stringstream으로 인해 사용되지 않음을 알게되었습니다. 제가 사용한 이후로 꽤 오래되었지만, 제가 그 때해야 할 일을했기 때문에 그 비난을 듣고 놀랐습니다.왜 std :: strstream가 더 이상 사용되지 않았습니까?

내 질문에 왜이 결정이 내려졌으며 std::strstream에없는 std::stringstream이주는 혜택은 무엇입니까?

+0

@Chris Lively : 네이밍 컨벤션에 관한 문제였던 것입니까, 아니면 농담입니까? – andand

+0

잘 모르겠지만 Google을 통해 발견 된이 URL은 다음과 같이 도움이 될 수 있습니다. http://bytes.com/topic/c/answers/158338-strstream-depreciation –

+1

@andand Exceptional C++을 확인하십시오. 잘 설명되어 있습니다. –

답변

88

strstream은 할당 방법이 명시되지 않았으므로 관리하기가 매우 어려웠던 char *을 반환했습니다. 따라서 삭제해야하는지 아니면 무료로()해야하는지 또는 완전히 다른 것을해야 하는지를 아는 것은 불가능합니다. 할당을 해제하는 유일한 방법은 freeze() 함수를 사용하여 strstream으로 다시 전달하는 것입니다. 이것은 충분히 명백하지 않았고 많은 사람들이 잘못 알고있었습니다. stringstream은 오류가 발생하기 쉬운 문자열 개체를 관리합니다.

문자열을 종료하는 데 ends을 사용해야하는 문제가 있지만 할당 해제 문제가 지원 중단의 주된 이유였습니다.

+1

friend-lock guard 접근자는 현재 솔루션 인 데이터 사본을 복사하지 않고이 문제를 해결했을 것입니다. {std :: bufferguard f (mystream); printf ("% s \ n", f.str()); } –

11

strstreamchar *을 빌드합니다. std::stringstreamstd::string입니다. 버퍼 넘침 가능성이 있기 때문에 strstream이 더 이상 사용되지 않습니다. std::string이 자동으로 예방합니다.

+0

strstream은 실제로 char *를 빌드하지 않습니다 ... ... it 내부적으로 할당 한 버퍼의 끝에 null을 붙입니다. 문제는 이상한 접근자가 "동결"하는 것이 었습니다 ... 경비원으로서 구현되어 있어야합니다. –

15

메모리 관리를보다 쉽게 ​​이해할 수 있습니다. (누가 할당 된 메모리를 해제하고 어떤 조건에서 자유롭게 할 책임이 있는지 기억할 수 있습니까?)

strstream은 여전히 ​​다른 곳에서는 사용할 수없는 무언가를 제공하기 때문에 계속 C++ 0X - at 가장 마지막으로 나는 그 초안을 확인했다).

+5

버퍼를 제공하는 경우 버퍼를 해제해야합니다. 버퍼를 제공하면 버퍼가 해제되지만 스트림을 고정 해제해야합니다. 그렇지 않으면 스트림이 고정되지 않습니다. 'c_str = stream.str();/* use c_str */stream.freeze (false); –

7

한 번 이상 개인적인 관점에서 나는 추적하기 위해 며칠 또는 몇 주가 걸렸던 모호한 메모리 손상을보고 결국 strstream의 사용으로 왔습니다. stringstream으로 교체하자마자 부패가 사라졌으며 더 이상 질문하지 않았습니다. 그것은 나를 위해 충분했다.

관련 문제