3월 23, 2017

[EC++ 17] Store  new ed objects in smart pointers in standalone statements.


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

위 코드는 1. new  메모리 할당 ->  shared_ptr  ctor call ->  priority()  call의 세 단계에 걸쳐 수행된다. 그런데 컴파일러에 의해  shared_ptr  ctor call과  priority()  call의 순서가 바뀔 수 있는데, 이 경우  priority() 가 예외를 던지면 memory leak이 발생하게 된다. 따라서  new ed object를   shared_ptr 에 넘겨주는 부분은 별도의 문장으로 따로 빼내는 것이 좋다.



Summary

  • Store  new ed objects in smart pointers in standalone statements. Failure to do this can lead to subtle resource leaks when exceptions are thrown.

Reference

  • Effective C++ by Scott Meyers

3월 22, 2017

[EC++ 16] Use the same form in corresponding uses of   new   and   delete  


  • 일반적으로 single object 와 array는 메모리 상의 구조가 다르다. single object는 메모리 상에 해당 object가 차지하는 공간만이 할당되지만, array는 메모리 상에 array의 크기를 먼저 기록하고 그 다음에 실제 object의 공간을 할당한다.
  • single object와 array는 메모리 상에 할당 되는 구조가 다르기 때문에 new와 delete를 사용하는 방법도 다르다. 따라서 single object와 array는   new    delete  를 사용하는 방법이 서로 다르며, 이를 뒤섞어 쓰면 안된다.
  • 이런 차이점 때문에, 클래스 설계 시 어떤 클래스가 동적 할당한 메모리를 가르키는 포인터를 멤버로 가지면서 여러 버전의 constructor를 제공한다면, 모든 constructor가 해당 포인터를 초기화하는데 모두 같은 형태의   new   를 사용하도록 주의해야 한다.
  •   typedef  를 사용할 때도 주의해야 한다. 예를 들어, array에 typedef를 사용하면 사용자는 typedef 된 자료형이 array인지 모르기 때문에 별 생각없이   new  -  delete  를 사용할 수 있다. 이 경우,   new[]    delete  를 같이 사용하는 것 같다.



Summary

  • If you use [] in a   new  expression, you must use [] in the corresponding   delete  expression, If you don't use [] in a   new  expression, you mustn't use [] in the corresponding   delete  expression.

Reference

  • Effective C++ by Scott Meyers