스마트 포인터

프로그래밍/C/C++ 2014. 11. 28. 03:31

동적 메모리 할당 과 해제에서 개발자의 실수로 메모리 누수(memory leak) 등이 발생하는 확률이 높다.

프로그램 규모가 커질수록 클래스의 내부 멤버들이 많아지고, 이를 동적 메모리로 할당해서 관리하면,

new와 delete를 자주 사용하게 된다. new로 할당받은 객체속 메모리는 반드시 delete로 해제하여야 한다.

그렇지 않으면 메모리 누수가 발생하게 된다.


C++11 표준에서 소개하는 스마트 포인터를 사용하면 편리하게 메모리 누수를 관리할 수 있다.


예제1. 스마트포인터 auto_ptr 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <memory>
#include <string>
using namespace std;
 
class food
{
    string name; // 이름
    int price; // 가격
 
public:
  // 생성자
    food(string _name, int _price){        
        this->name = _name;
        this->price = _price;
        cout << "생성자 호출" << endl;
    }
  // 소멸자
    ~food() {
        cout << "소멸자 호출" << endl;
    }
  
  // 정보 출력
    void printData() {
        cout << "name = " << this->name << ", price = " << this->price << endl;
    }
};
 
int main()
{
    auto_ptr<food> test(new food("apple", 30));
    test->printData();
    return 0;
}


결과


스마트 포인터 auto_ptr를 이용한 동적메모리 할당에서는 개발자가 따로 delete를 하지 않아도 

소멸자를 호출하면서 할당된 메모리를 자동으로 해제한다.


만약 동일 객체를 두 개의 포인터로 가리키게 하면 두 개의 포인터 각각의 메모리를 해제하였을 때,

중복으로 메모리를 해제하는 경우가 발생해 오류가 발생하게 된다.


메모리를 자동으로 해제해 주는 auto_ptr를 사용하면 편리하지만 한편으로는 개발자에게 매우 위엄한 상황이

발생되기도 한다. 엄밀히 말하면 C++11 표준에서는 auto_ptr 사용을 권고하지 않는다. 그렇다면 해결책이 없는것일까?


이 경우 unique_ptr를 사용하면 된다.


unique_ptr는 C++11 표준에서 사용할 수 있는 스마트 포인터이다.

unique_ptr는 auto_ptr와 유사하게 가리키는 객체의 소유권을 그대로 강조하지만, 메모리 중복 해제로

인한 런타임 오류가 발생하지는 않는다. 컴파일러가 미리 이런 오류를 처리해 준다.


unique_ptr를 사용하여 어느 정도 스마트 포인터의 요구 사항을 충족하긴 했지만, 

하나의 객체를 여러 스마트 포인터로 가리키길 원할 수 있다.

이 경우 컴파일 타임이나, 런타임에서 오류 없는 스마트 포인터를 C++11에서 제공한다.

shared_ptr라는 스마트 포인터를 사용하면 된다.




'프로그래밍 > C/C++' 카테고리의 다른 글

c++ strtok  (0) 2014.12.13
메모리 관리 함수(memset, memcpy, memmove)  (0) 2014.10.24
C++ 파일 입출력  (0) 2014.02.24
함수 주요 형태(_stdcall, _cdecl, _fastcall)  (0) 2014.02.24
비트 연산자  (0) 2014.02.12