해결된 질문
작성
·
181
0
안녕하세요. 강의 잘 보고 있습니다.
실습 중 궁금한 것이 있어서 질문 남깁니다.
CMyStringEx::onSetData 함수 내용입니다.
void CMyStringEx::onSetData(const char*& param)
{
CMyString::onSetData(param);
// 생략
if (param != nullptr) {
if (strcmp(param, "멍멍이아들") == 0) {
// delete [] param;
param = "우리귀요미";
}
}
}
param이 가리키고 있는 곳의 데이터가 "멍멍이아들" 문자열이면 "우리귀요미"라는 새 문자열이 담긴 주소로 바꿔주기 전에 기존 param이 가리키고 있는 곳을 delete 해줘야 메모리 누수가 발생하지 않을 것 같은데 맞나요?
만약 1번이 맞아서 delete를 한다면 CMyString::~CMyString() 소멸자가 호출될 때 문제가 발생할 것 같은데 이를 어떻게 해결하면 될까요?
답변 1
0
onSetData() 함수는 문자열을 저장하기 위한 메모리를 할당하기 전에 호출됩니다. 여기서 원본 문자열을 슬쩍 바꿔치기 하는 것이지요. 따라서 메모리 누수를 걱정할 필요는 없겠습니다. 문자열의 본질은 cost char[] 입니다. 첫 글자가 저장된 메모리 주소로 식별하는 것이 보통인데 문자열은 이름이 없는 배열과 같고 주소로 식별합니다. 그리고 이 문자열 상수는 정적 영역 메모리에 이미 로드되어 있습니다. 따라서 원본 문자열의 메모리 누수를 걱정할 이유는 없겠습니다.
1번에서 설명한 내용에 따라 고려의 대상이 아닙니다.
참고하시기 바랍니다. 😄
감사합니다. 제가 생각이 짧았습니다. 지금 다시 보니 매개변수로 받은 문자열을 바꿔치기 하는 것이지 멤버 변수를 조작하는 것이 아니었네요...