[ Effective C++ ] 항목 17 : new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자

Minsu._.Lighting·2023년 11월 22일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" 자원 누출 가능성을 최대한 낮추자 "

  • 예외가 발생했을 때 디버깅하기 힘든 자원 누출을 초래할 수 있으므로 new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만들자!

💡 함수의 매개변수에 대한 컴파일러의 인자 평가 순서

processWidget(shared_ptr<Widget>(new Widget), priority());

  • 다음과 같은 코드에서 컴파일러는 매개변수에 대한 컴파일러의 인자 평가를 통해 순서를 정함
    - 컴파일러 제작사 마다 다르다는게 문제 **
    - 자바, C#등은 고정적, C++은 그러지 못함.

    컴파일러는 아래와 같은 연산을 수행 해야 함

    • priority 호출
    • new Widget 실행
    • shared_ptr 생성자 호출
  • new Widget의 결과는 shared_ptr의 생성자에 건내져야 하기 때문에 shared_ptr의 생성자 호출 연산 보다는 먼저 실행이 되겠지만 priority의 순서는 무작위... 만약 순서가 아래 처럼 정해진다면??

    컴파일러는 아래와 같은 연산을 수행 해야 함

    • new Widget 실행
    • priority 호출
    • shared_ptr 생성자 호출

    📢 priority 호출 부분에서 예외가 발생한다면 new Widget으로 만들어진 자원이 유실될 수 있음

📌 해결 방법

[해결 방법 코드]
shared_ptr<Widget>pw(new Widget);

processWidget(pw, priority());
  • Widget을 생성해서 스마트 포인터에 넘기는 코드를 별도의 한 문장으로 만들고, 스마트 포인터를 processWidget에 넘기는 것!
profile
오코완~😤😤

0개의 댓글

관련 채용 정보