> 백엔드 개발 > C++ > 본문

`stringstream.str().c_str()`을 ​​`const char*`에 할당하면 댕글링 포인터가 발생하는 이유는 무엇이며 이 문제를 어떻게 해결할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-11-22 07:17:14
원래의
169명이 탐색했습니다.

Why does assigning `stringstream.str().c_str()` to a `const char*` lead to a dangling pointer, and how can this issue be resolved?

Stringstream, String 및 char* 변환 이해

프로그래밍에서 흔히 발생하는 혼란 중 하나는 stringstream, string 및 char 간의 상호 작용과 관련됩니다. 전환. 이 문서의 목적은 stringstream.str().c_str()에서 반환된 문자열이 메모리에 있는 위치와 이 문자열을 const char에 직접 할당할 수 없는 이유를 명확히 하는 것입니다.

stringstream을 사용할 때 str( ) 함수는 호출된 표현식 내에서만 존재하는 임시 문자열 객체를 반환합니다. 이 문자열 개체는 일반적으로 스택에 생성되며 표현식이 끝나면 삭제됩니다.

제공된 코드 예제를 살펴보겠습니다.

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

using namespace std;

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로 변환합니다. 반환된 문자열은 임시 문자열이므로 표현식이 끝난 후 삭제되어 매달려 있는 포인터를 가리키는 cstr2를 렌더링합니다. 결과적으로 cstr2를 인쇄하면 가비지가 발생합니다.

문제 해결:

이 문제를 방지하려면 임시 문자열을 영구 문자열 객체에 복사하여 해당 문자열을 얻을 수 있습니다. C 스타일 문자열을 사용하거나 임시 문자열을 const 참조에 바인딩하여 수명을 연장합니다.

// Copy to a permanent string
const std::string tmp = stringstream.str();
const char* cstr = tmp.c_str();

// Bind to a const reference
{
  const std::string&amp; tmp = stringstream.str();   
  const char* cstr = tmp.c_str();
}
로그인 후 복사

수정된 코드 예시에서 두 cstr은 모두 cstr2는 const 문자열 객체의 수명 동안 존재하는 유효한 C 스타일 문자열을 가리킵니다. 결과적으로 두 문자열을 모두 올바르게 인쇄할 수 있습니다.

임시 문자열을 const 참조에 바인딩하는 것이 불필요한 복사를 피하고 보다 효율적이고 간결한 솔루션을 허용하므로 일반적으로 선호된다는 점에 유의하는 것이 중요합니다.

위 내용은 `stringstream.str().c_str()`을 ​​`const char*`에 할당하면 댕글링 포인터가 발생하는 이유는 무엇이며 이 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿