• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

질문 드립니다.

19.09.29 22:47 작성 조회수 105

5

질문1: 3분 40초 경에, 동적할당이든 아니든 영역을 벗어날 떄 소멸된다고 말씀하셨는데. delete을 해주게 되면 영역을 벗어날때가 아닌 delete이 호출될 때 소멸자가 호출되는게 맞지 않나요?

질문2: 동적할당된 객체를 delete 을 하지 않을 경우, 동적할당된 객체의 소멸자는 호출되지 않고 콘솔 프로그램이 종료되는 것을 확인하였습니다. 이 것은 메모리 누수로 보는 것이 맞나요? 

#include <iostream>
#include <string>

using namespace std;

class Simple
{
private:
	int m_id;

public:
	Simple(const int& id_in)
		: m_id(id_in)
	{
		cout << "Constructor" << m_id << endl;
	}

	~Simple() // 소멸자는 파라미터가 없다
	{
		cout << "Destructor" << m_id << endl;
	}
};

class IntArray
{
private:
	int *m_arr = nullptr;
	int m_length = 0;

public:
	IntArray(const int length_in)
	{
		m_length = length_in;
		m_arr = new int[m_length];

		cout << "Constructor" << endl;
	}
	
	int size() { return m_length; };
};

int main()
{
	Simple *s3 = new Simple(3);
	Simple s1(0);
	Simple s2(1);

	//delete s3; // delete을 안 하면 소멸자가 호출되지 않음
	                  // delete을 하면 소멸자가 호출됌


	return 0;

답변 3

·

답변을 작성해보세요.

3

안녕하세요?

1번은 지적하신 부분이 맞습니다. 저도 왜 그렇게 얘기했는지 어리둥절하네요. 동적할당으로 만든 instance는 delete으로 지워주기 전에는 소멸자가 호출되지 않습니다. 이건 워낙 치명적인 오류라서 빨리 수정하도록 하겠습니다. 공부하는데 오해 없으셨으면 좋겠네요.

2번은 메모리 누수가 생겼겠지만 프로그램이 종료가 되는 과정에서 대부분의 경우 OS가 청소를 해줍니다. 예전에는 OS의 청소 기능이 미흡해서 큰 프로그램 돌릴 때는 문제가 생기기도 했었던 것 같은데 최근에는 그런 경우를 본 적이 없습니다.

좋은 질문 감사하고 앞으로도 의아한 부분이 있으면 알려주세요.

감사합니다.

2

제가 강의를 처음부터 다시 봤는데, 여기서 '자동으로'라는 것은 소멸자를 직접 호출하는 것이 아니라 영역을 벗어나거나 delete으로 메모리를 해제해주면 소멸자가 내부적으로 알아서 호출이 된다는 의미입니다. 우리가 소멸자를 수동으로 호출하는 경우는 없다는 것을 강조한 얘기입니다. 아마 이부분은 이미 이해하신 것 같습니다.

0

tndyd8282님의 프로필

tndyd8282

질문자

2019.09.30

답변을 주신 내용 잘 이해하였습니다. 강의에 친절하게 추가로 달아주신 보충설명도 잘 보았습니다.

정말 감사합니다.