[effective STL] 항목 07 : 포인터를 컨테이너 담을 때 주의

2015. 9. 6. 18:59프로그래밍/Effective STL

728x90
728x90

이유

컨테이너는 소멸시에 객체의 메모리를 해제하지만 포인터의 소멸자가 아무 일도 하지 않는다.

포인터에 대해 delete를 하지 않기 때문!!


예제

1
2
3
4
5
6
7
8
9
10
11
void doSomthing()
{
    std::vector<Widget*> vwp;
 
    for (int i = 0; i < 10; i++)
    {
        vwp.push_back(new Widget);
    }
 
    // use vwp
// memory leak
cs


해당 코드는 vwp에서 Widget에 대한 포인터를 담아서 관리한다.

이런 경우 delete는 프로그래머가 관리해줘야한다.


간단한 해결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void doSomthingDelete()
{
    std::vector<Widget*> vwp;
 
    for (int i = 0; i < 10; i++)
    {
        vwp.push_back(new Widget);
    }
 
    // use vwp
 
    for (Widget* i : vwp)
    {
        delete i;
    }
}
 
cs


하지만 이 코드는 예외 안전성에 취약하다.

vwp에 포인터가 들어 있고 delete가 수행되기 직전에 예외가 발생하면 결국 누수...


해결하는 방법은 template을 이용한 방법이 있는데

이것들도 그닥 좋아보이진 않는다.. 그냥 마지막에 스마트 포인터 사용하는 것으로


스마트 포인터 사용해서 해결하기

1
2
3
4
5
6
7
8
9
10
11
12
void doSomthingSharedPTR()
{
    typedef std::shared_ptr<Widget> SPW;
 
    std::vector<SPW> vwp;
    for(SPW ptr : vwp)
    {
        vwp.push_back(SPW(new Widget));
    }
 
    // use
}
cs


좋아 깔끔해!

728x90
반응형