IT 프로그래밍/C++

[따배시 C++ 8.6] 소멸자 destructor

기술1 2024. 4. 10. 21:11
반응형

소멸자란?

소멸자는 return 타입이 없습니다. 그리고 파라미터 또한 없습니다. 

#include <iostream>
using namespace std;

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

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

	~IntArray()
	{
		if (m_arr != nullptr)
			delete[] m_arr;
		delete[] m_arr;
	}

	int size() { return m_length; }
}

int main()
{
	while (true)
	{
		IntArray my_int_arr(10000);
		delete[] my_int_arr.m_arr;
	}

	return 0;
}

메모리 누수가 발생하지 않도록 하는 것이 소멸자를 사용할 때 가장 주의해야 할 점입니다. 해당 코드 같은 경우 메모리 누수문제를 해결하지 못한 사례라고 볼 수 있는데요. Intarray()라는 소멸자를 정의하여 동적으로 할당된 메모리를 해제하고 있습니다. 이 소멸자는 객체가 해제될 때 항상 호출되므로, 객체의 수명이 끝날 떄마다 메모리를 안전하게 해제하는 역할을 합니다. 

#include <iostream>
using namespace std;

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

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

    ~IntArray()
    {
        if (m_arr != nullptr)
            delete[] m_arr;
    }

    int size() { return m_length; }
};

int main()
{
    while (true)
    {
        IntArray my_int_arr(10000);
    }

    return 0;
}

이렇게 코드를 해서 메모리가 해제하는 과정이 중복되지 않도록 해주었습니다. 이제 delete[] m_arr는 소멸자에서만 호출되므로 객체가 소멸될 때 메모리가 올바르게 해제됩니다. 

반응형