inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

[실습 프로젝트: CMyString] 이동 시맨틱 적용 - Step05

이동생성자 관련

해결된 질문

329

두부

작성한 질문수 3

0

안녕하세요. 선생님

 

이동 생성자 강의 내용 중 질문이 있습니다. (아래 코드 참고)

 

delete pnData를 하면, 포인터 변수가 해제되어

pnData = rhs.pnData;를 실행할 수 없는 것이 아닌지 궁금합니다. 실재로는 포인터 값은 그대로고, 가리키는 값(int 0)만 삭제되는 것인가요?

 

포인터 값은 놔두고 가리키는 값만 없애는 문법은 어떻게 되나요? delete를 안하고, pnData = nullptr; 로만 수정해도 됬을 것 같습니다.

 

class TestData
{
public:
	TestData(){
    	pnData = new int(0);
    }
    ...
    TestData(TestData&& rhs) noexcept{
    	delete pnData;
    	pnData = rhs.pnData;
        rhs.pnData = nullptr;
    }
    ...
    TestData& operator=(TestData&& rhs) noexcept{
   	delete pnData;
        pnData = rhs.pnData;
        rhs.pnData = nullptr;
    }
}

c++ microsoft-windows 객체지향 디자인-패턴

답변 3

1

널널한 개발자

delete pnData; 연산을 수행한다고 하더라도 포인터 변수 자체가 사용하는 메모리는 사라지지 않습니다.

예를 들어

char *pszData = nullptr;

pszData = (char*)malloc(128);

...

free(pszData);

같은 코드를 수행하더라도 pszData 변수가 사용하는 메모리가 해제되지는 않습니다. new나 delete도 동일합니다.

1

두부

이해되었습니다.

감사합니다!!😁

0

널널한 개발자

포인터를 멤버로 갖는 객체가 소멸하면 포인터 멤버도 함께 소멸합니다. 그러므로 포인터 메모리 자체에 대해 고민할 필요는 없겠습니다.

0

두부

포인터를 멤버로 갖는 객체가 소멸하면 포인터 멤버도 소멸되는 것은 당연합니다.(클래스)

-> 포인터 메모리 자체를 삭제하는 방법은 객체 소멸 방법 밖에 없나요? free 함수등으로 가능한가요?


Q. 제일 궁금한 내용은 delete 연산(포인터가 가리키는 값을 삭제)한 이후, 어떻게 rhs.pnData 값을 대입할 수 있는지입니다.
delete 연산을 하면, 포인터 메모리 자체는 살아있는지 여부입니다.

<강의 코드>

delete pnData;
pnData = rhs.pnData;

 

0

널널한 개발자

우선 pnData 는 int* 멤버인 것으로 가정하고 답변하겠습니다.

포인터는 포인터 자체와 포인터가 가리키는 대상으로 구별해 생각해야 하겠습니다. delete pnData; 라는 코드가 수행되면 포인터가 가리키는 대상 메모리는 해제됩니다. 그렇다고 포인터 값이 달라지는 것은 아닙니다. 가령 내 휴대폰에 저장된 친구 길동이의 전화번호는 길동이가 휴대폰 번호를 바꾼다 하더라도 알아서 바뀌지 않습니다. 포인터 변수는 그저 주소를 저장하기 위한 용도로 사용되는 변수형식 입니다. 그 속에 저장된 주소의 메모리가 할당되어 사용할 수 있는지 여부와 아무런 관련이 없습니다.

pnData = rhs.pnData; 코드는 r-value에 저장된 주소를 pnData에 저장하는 것입니다. 단순히 주소만 저장할 뿐 대상 메모리를 복사하지는 않습니다.

 

끝으로 포인터 값은 두고 가리키는 대상(값이 아니라 메모리)를 삭제하는 방법은 delete 연산을 하는 것입니다. pnData = nullptr; 같은 코드를 수행하면 동적 할당된 메모리가 해제되지 않고 주소 값을 잃어버리기 되어 메모리 누수가 발생합니다.

포인터에 대해 다시 복습할 것을 권합니다. 감사합니다. 😄

1

두부

자세히 설명해주셔서 이해가 되었습니다.

감사합니다.

 

그럼 혹시 pnData 주소값을 가리키는 포인터 자체도 메모리일텐데, 해당 포인터의 메모리를 해제할수 있는 방법도 있나요?

포인터가 가리키는 값만 해제하면 포인터 자체는 남아있을것 같아서요.

인터페이스 상속과 추상 자료형 2:00 질문

0

50

1

13분 42초의 예제

0

52

2

네임스페이스 스코프 내에서 정의된 변수, 함수들이 위치하는 곳 질문

0

47

1

소멸자 가상함수 질문

0

55

2

이동생성자의 매개변수로 넘어가는 임시객체의 값 유지 관련하여 질문이 있습니다.

0

64

2

임시 객체 복사 생성자 질문드립니다

0

67

2

변수 바인딩에 대한 의문점

0

113

1

C++ 파일 구조 질문

0

128

1

빈 포인터에 멤버함수 호출

0

104

1

파생클래스에서 virtual함수를 선언에 대한 질문입니다.

0

117

2

순수 가상 클래스 선언과 일반 인트 변수의 선언과 다른가요?

0

137

2

안녕하세요. 이동의미론에 대해 제가 잘 이해했는지 궁금합니다.

0

133

1

인스턴스의 개념에 대해 int a(3), int(5) 예시를 바탕으로한 질문입니다.

0

189

2

식별자 검색 순서 관련 namespace 생략 관련 오류에 관한 질문

0

175

1

마지막 주소록 예제 c 파일 한글 깨짐 현상

0

190

1

nullprt vs null

0

153

2

쓸데없지만 질문드리고싶습니다

0

181

1

복사 생성자 질문 드립니다.

0

221

1

생성자 궁금한거 있습니다

0

218

2

단순대입 오류 발생 이유

0

235

1

네가지 형변환 강의 질문

0

283

1

CMyString Step10 강의 질문

0

176

1

임시 객체와 보이지 않는 복사 생성 강의 질문

0

268

2

섹션8 3번째 강의 (실습 프로젝트 - 문자열 필터개선) 질문

0

219

2