인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김상현님의 프로필 이미지
김상현

작성한 질문수

C개발자를 위한 최소한의 C++

[실습 프로젝트: CMyString] 문자열 필터 개선 - Step10 (※매우 중요)

문자열 필터 실습 코드 중 질문 드립니다.

해결된 질문

작성

·

183

0

안녕하세요. 강의 잘 보고 있습니다.

실습 중 궁금한 것이 있어서 질문 남깁니다.

CMyStringEx::onSetData 함수 내용입니다.

void CMyStringEx::onSetData(const char*& param)
{
    CMyString::onSetData(param);
    // 생략
    if (param != nullptr) {
        if (strcmp(param, "멍멍이아들") == 0) {
            // delete [] param;
            param = "우리귀요미";
        }
    }
}
  1. param이 가리키고 있는 곳의 데이터가 "멍멍이아들" 문자열이면 "우리귀요미"라는 새 문자열이 담긴 주소로 바꿔주기 전에 기존 param이 가리키고 있는 곳을 delete 해줘야 메모리 누수가 발생하지 않을 것 같은데 맞나요?

  2. 만약 1번이 맞아서 delete를 한다면 CMyString::~CMyString() 소멸자가 호출될 때 문제가 발생할 것 같은데 이를 어떻게 해결하면 될까요?

     

답변 1

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

  1. onSetData() 함수는 문자열을 저장하기 위한 메모리를 할당하기 전에 호출됩니다. 여기서 원본 문자열을 슬쩍 바꿔치기 하는 것이지요. 따라서 메모리 누수를 걱정할 필요는 없겠습니다. 문자열의 본질은 cost char[] 입니다. 첫 글자가 저장된 메모리 주소로 식별하는 것이 보통인데 문자열은 이름이 없는 배열과 같고 주소로 식별합니다. 그리고 이 문자열 상수는 정적 영역 메모리에 이미 로드되어 있습니다. 따라서 원본 문자열의 메모리 누수를 걱정할 이유는 없겠습니다.

  2. 1번에서 설명한 내용에 따라 고려의 대상이 아닙니다.

참고하시기 바랍니다. 😄

김상현님의 프로필 이미지
김상현
질문자

감사합니다. 제가 생각이 짧았습니다. 지금 다시 보니 매개변수로 받은 문자열을 바꿔치기 하는 것이지 멤버 변수를 조작하는 것이 아니었네요...

김상현님의 프로필 이미지
김상현

작성한 질문수

질문하기