>백엔드 개발 >C++ >`stringstream.str().c_str()`이 C에서 메모리 오류를 일으키는 이유는 무엇입니까?

`stringstream.str().c_str()`이 C에서 메모리 오류를 일으키는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-15 05:01:021055검색

Why Does `stringstream.str().c_str()` Cause a Memory Error in C  ?

stringstream, string, char 간의 변환에 대한 혼란*

이 문제는 stringstream.str()에서 얻은 문자열을 변환할 때 발생합니다. c_str()을 const char*로 변환합니다. 잠재적인 오류를 방지하려면 반환된 문자열의 메모리 관리와 수명을 이해하는 것이 중요합니다.

코드 조각은 문제를 보여줍니다.

#include <string>
#include <sstream>
#include <iostream>

int main()
{
    stringstream ss("this is a string\n");

    string str(ss.str());

    const char* cstr1 = str.c_str();

    const char* cstr2 = ss.str().c_str();

    cout << cstr1   // Prints correctly
        << cstr2;   // ERROR, prints out garbage

    system("PAUSE");

    return 0;
}

stringstream.str().c_str( )를 const char*에 할당할 수 없습니다. 이로 인해 cstr2가 가비지를 인쇄하는 버그가 발생합니다.

메모리 관리 이해

stringstream.str()은 끝까지만 유효한 임시 문자열 객체를 반환합니다. 현재 표현의 표현식이 완료되면 임시 개체가 삭제되고 해당 데이터에 대한 포인터(c_str()에서 반환됨)가 유효하지 않게 됩니다.

오류 해결

해결 방법 이 문제에서는 임시 문자열 개체를 다음과 같은 별도의 변수에 저장해야 합니다.

const std::string tmp = stringstream.str();
const char* cstr2 = tmp.c_str();

임시 개체를 tmp에 저장하면 포인터의 수명이 연장되고 이제 cstr2 인쇄가 올바르게 작동합니다.

보너스 포인트 설명

수정된 코드 블록에서:

cout << cstr           // Prints correctly
    << ss.str().c_str() // Prints correctly
    << cstr2;           // Prints correctly (???)

이제 모든 인쇄 문이 다음과 같은 이유로 올바르게 작동합니다.

위 내용은 `stringstream.str().c_str()`이 C에서 메모리 오류를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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