>  기사  >  백엔드 개발  >  `stringstream.str().c_str()`을 ​​`const char*`에 할당하면 가비지 출력이 발생하는 이유는 무엇입니까?

`stringstream.str().c_str()`을 ​​`const char*`에 할당하면 가비지 출력이 발생하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-16 17:16:03465검색

Why Does Assigning `stringstream.str().c_str()` to a `const char*` Lead to Garbage Output?

stringstream, string 및 char* 변환 혼란

이 문서에서는 stringstream에서 반환된 문자열에 const char*를 할당하는 문제를 다룹니다. .str().c_str().

문제 설명

stringstream.str()은 표현식 끝에서 삭제되는 임시 문자열 개체를 구성합니다. 이 임시 문자열을 const char*에 할당하면 포인터가 삭제된 문자열을 참조하여 가비지 출력이 발생합니다.

예는 다음과 같습니다.

stringstream ss("this is a string\n");
const char* cstr = ss.str().c_str();

위 코드에서 표현식 뒤 종료되면 stringstream.str()에 의해 생성된 임시 문자열이 삭제되어 cstr이 잘못된 메모리 위치를 가리키게 됩니다.

해결 방법

이 문제를 해결하려면 임시 문자열은 const char*로 변환하기 전에 다른 문자열 객체에 복사되어야 합니다. 이는 다음 접근 방식을 사용하여 달성할 수 있습니다.

string tmp = stringstream.str();
const char* cstr = tmp.c_str();

보너스 포인트 설명

다음 수정 코드는 문자열을 올바르게 인쇄합니다.

cout << cstr << ss.str().c_str() << cstr2;

이 수정은 다음과 같은 이유로 작동합니다.

  • cstr은 알려진 수명을 가진 문자열 객체에서 생성된 const char*를 가리킵니다.
  • ss.str().c_str()은 반환합니다. 이제 stringstream.str()
  • cstr2가 반환한 const 참조로 보호되는 임시 문자열을 가리키는 const char*는 ss.str().c_str()과 동일한 임시 문자열을 가리킵니다. 그러나 이는 const가 아니므로 cout 문의 끝에서 소멸되는 임시 char*에 할당될 수 있습니다.

위 내용은 `stringstream.str().c_str()`을 ​​`const char*`에 할당하면 가비지 출력이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.