C++ 생성자 소멸자
생성자와 소멸자의 스터디로서 생성을 통해 array를 생성하고 main의 마지막에서 소멸이 되어 소멸자가 불리는 시점에 m_Array를 소멸시켰다.
이와 같은 방법으로 메모리에 더미 데이터가 쌓이게 되는 이슈를 막을 수 있다.
#include <iostream>#include <cstddef>
using namespace std;
class IntArray{private: int* m_Array; int m_Length;
public: IntArray(int length) //Constructor { m_Array = new int[static_cast<size_t>(length)]{}; m_Length = length; }
~IntArray() { delete[] m_Array; cout << "class deleted" << endl; }
void SetValue(int index, int value) { m_Array[index] = value; }
int GetValue(int index) { return m_Array[index]; }
int GetLength() { return m_Length; }};
int main(){ IntArray ar(10); int a;
for(int count = 0; count < ar.GetLength(); ++count) { ar.SetValue(count, count +1); }
cin >> a; cout << "The value of elemnt " << a << " is" << ar.GetValue(a) << '\n';
return 0;
}
#include <iostream>#include <cstddef>
using namespace std;
class Simple{private: int m_ID;
public: Simple(int id):m_ID(id) { cout<<"Contructing Simple"<<m_ID<<endl; }
~Simple() { cout<<"Destructing Simple"<<m_ID<<endl; }
int GetID() { return m_ID; }};
int main(){ //스텍에 단순 할당 Simple simple(1); cout << simple.GetID() << endl;
//동적 할당 Simple* pSimple = new Simple(2); cout << pSimple->GetID() << endl;
//동적 할당 삭제 delete pSimple;}
RAII (Resource Acquisition Is Initialization)는 객체의 수명과 리소스 관리와 연관있는 프로그래밍 디자인 기법이다. C++ 에서 RAII는 클래스의 생성자와 소멸자로 구현되었다.
- 리소스(메모리, 파일 또는 데이터베이스 핸들 등)는 일반적으로 객체의 생성자에서 획득된다.
- 그러면 그 리소스는 객체가 살아있는 동안 사용될 수 있다.
- 객체가 소멸하면 자원이 소멸된다.
RAII의 장점은 리소스를 보유한 객체가 자동으로 정리됨에 따라 리소스 누수(예: Memory Leak)를 방지하는 데 도움이 된다는 것이다.
중요 !!
생성자와 소멸자를 함께 사용하면 프로그래머가 특별한 작업을 하지 않아도 클래스는 스스로 초기화하고 정리할 수 있다. 이렇게 하면 오류가 발생할 확률을 낮추고 클래스를 더 쉽게 사용할 수 있다.
https://boycoding.tistory.com/249
https://www.hellot.net/news/article.html?no=25086
1. 생성자(constructor)와 소멸자(~constructor)의 개념
C, C++은 하드웨어 제어 등 가장 많이 쓰는 언어 중 하나이다. 이번에는 C++에서 생성자와 소멸자에 대해 파악해 본다. 생성자와 소멸자는 간단히 줄여서 객체를 생성하고 소멸시키는 것이다. 객체를 생성하기 위해서는 메모리를 할당해야 하며, 소멸시키기 위해서는 메모리를 반환해야 한다. 생성자와 소멸자를 비교해서 설명하면 다음과 같다.

2. 생성자와 소멸자 형식
가. 생성자
class 이름 :: class 이름() // class 이름과 함수 이름이 동일
{
생성자 몸체
}
나. 소멸자
class명 :: ~class 이름() // class 이름과 함수 이름이 동일
{
소멸자 몸체
}
3. 생성자 예제
생성자 예제를 살펴본다. 프로그램에서 Seoul::Seoul()가 생성자이다.
(예제 1)
#include <iostream>
using namespace std;
class Seoul
{
public:
Seoul(); // class명과 동일한 디폴트(기본) 생성자. 공개 멤버함수
void dataShow(); // 공개 멤버함수
private:
unsigned int Temp; // 비공개 멤버변수
unsigned int Population; // 비공개 멤버변수
};
Seoul::Seoul() // 생성자 정의
{
Temp = 30; // 멤버변수 초기화
Population = 1500; // 멤버변수 초기화
}
void Seoul::dataShow()
{
cout << "서울의 온도는 " << Temp << "도 입니다." <<endl;
cout << "서울의 인구는 " << Population << "만 입니다."<< endl;
}
int main()
{
Seoul happy; // 생성자 Seoul()이 실행됨.
happy.dataShow();
return 0;
}
댓글
댓글 쓰기