c++는 비관리 코드(unmanaged code)이기 때문에 개발자가 메모리관리를 전부 해줘야한다. 즉, 동적으로 할당 된 객체는 메모리 할당-회수를 항상 페어로 생각해야 한다.
그러나 코드의 양이 커지다보면 예상치 못한 부분에서 객체의 메모리를 회수하지 못함으로인해 메모리 누수가 발생하기도 한다. java나 c#같은 언어에서는 GC가 관리해주지만 c++는 그렇지 못하기 때문에 smart pointer가 그 기능을 대신한다.
memory헤더 안에 선언되어 있으며 c++11부터 사용 가능하다.
smart pointer중 shared_ptr의 동작 원리는 참조 카운팅 방식이다. 즉, 객체를 참조할때마다 카운트가 올라가고 그 카운트가 0이 되는 순간 객체를 delete 시킨다. 이러한 기능을 사용하면 개발자가 굳이 메모리의 해제를 신경써주지 않아도 되고 실수를 줄일 수있게 된다.
delete를 잘 해준것 같지만 의도하지 않게 다음과 같은 경우 메무리 누수가 발생하게 된다.
[예제]
class Test{
public:
Test(){
cout<<"Constructor Test"<<endl;
}
~Test(){
cout<<"Destructor Test"<<endl;
}
};
void testFunc(){
Test * pTest = new Test();//memory leak
int ret = 0;
if(ret == 0)
return ;
delete pTest;
}
실행결과
Start Program
Constructor Test
End Program
다음과 같이 shared_ptr을 사용해 보면 안전하게 메모리가 회수되었음을 알 수 있다.
[예제]
#include <memory>
void testFunc(){
shared_ptr<Test> smartPtr(new Test());
int ret = 0;
if(ret == 0)
return ;
}
실행결과
Start Program
Constructor Test
Destructor Test
End Program
'C and C++' 카테고리의 다른 글
[C++] 객체의 값을 전달할때 복사 비용을 줄이는 방법 "상수객체 참조자" (0) | 2018.07.10 |
---|---|
[C++] RAII스타일로 동작하는 lock_guard (0) | 2018.06.25 |
[C++] 상속을 허용하는 Base 클래스의 소멸자는 반드시 가상(virtual) 소멸자로 선언 (0) | 2018.06.03 |
[C++] 기본으로 만들어지는 생성자,복사 생성자, 소멸자, 대입 연산자와 이를 금지하는 방법 (0) | 2018.05.26 |
[C++] 객체를 초기화 할때는 생성자 초기화 리스트를Initialize List) 사용하기 (0) | 2018.05.13 |