티스토리 뷰

반응형

new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자.

 

new를 사용하여 생성한 객체를 스마트 포인터등에 저장 할 때 단계가 많거나 복잡할 수 록  메모리 누수가 발생 할 수 있다.

 

예제 1

1
2
3
4
5
6
7
8
9
10
11
12
//우선 순위를 알려 주는 함수
int priority();
 
//동적으로 할당한 Widget객체에 대해 어떤 운선순위에 따라 처리를 적용하는 함수    
void processWidget(std:tr1::shared_ptr<Widget>pw, int priority);
 
void main()
{
    processWidget(std:tr1::shared_ptr<Widget>(new Widget),priority());
 
 
cs

어디서든 잘 쓰고 있는 자원 관리 객체를 쓰고 있지만, 이 문장은 자원을 흘릴 가능성이 있다.
1. priority 호출
2. new Widget 호출
3. std::tr1:shared_ptr 생성자 호출

자원을 흘리게 되는 이유는 각각의 연산이 실행되는 순서가 컴파일러 제작사마다 다르다는 게 문제이다
new Widget을 먼저 실행하고 priority 호출 부분에서 예외가 발생한다면 tr1::shared_ptr에 저장되기도 전에 예외가 발생했으니 자원을 흘리게 된다.

 

해결 방법

1
2
3
4
5
6
7
void main()
{
    std::tr1::shared_ptr<Widget> pw(new Widget);
    //new로 생성한 객체를 스마트 포인터에 담는 코드를 하나의 독립적인 문장으로만든다.
    processWidget(pw, priority());   //자원 누출 걱정이 없다.
}
 
cs

Widget을 생성해서 스마트 포인터에 저장하는 코드를 별도의 문장 하나로 만들고,
processWidget에 넘긴다.

 

결론

new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들자

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함