ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective C++...16
    일지 2022. 6. 16. 07:26

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

    C++의 연산 실행 순서

    다른 언어와 달리 C++는 연산 실행 순서가 컴파일러 제조사마다 다르다.

    그렇기 때문에 스마트 포인터에 자원이 저장되기 전에 에러가 발생하는 경우가 있을 수 있다.

     

    다음은 문제가 될 수 있는 코드이다.


    processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());


     

    위 코드의 실행 순서는 new Widget은 항상 먼저 실행되지만 shared_ptr의 생성자와 priority()의 실행 순서는 바뀔 수 있다.

    그런데 priority() 가 먼저 실행되는 경우에 priority()에서 에러가 발생한다면 스마트 포인터에 자원이 들어가기 전에 에러가 발생했으므로 메모리가 유출될 수 있다.

     

    메모리 유출을 막는 초기화 방법

    문장의 연산 실행 순서가 정해져 있지 않다면 문장을 구분하면 된다.


    std::tr1::shared_ptr<Widget> pw(new Widget);

    processWidget(pw, priority());


     

    댓글

Designed by Tistory.