C++ 순환 의존성 문제 (Circular Dependency Issues)
·
C++/SmartPointer
순환 의존성 문제 (Circular Dependency Issues) 순환 의존성 shared_ptr가 클래스 내부에서 계속 존재하게 되면, 인스턴스가 소멸자를 호출하지 못한다. 만약 인스턴스 두 개가 멤버로 서로를 shared_ptr로 가지고 있다면, 마치 교착 상태처럼 소멸자를 둘 다 호출하지 못하는 상태가 된다. #include #include class Person { std::string name_; std::shared_ptr partner_; public: Person(const std::string& name) : name_(name) { std::cout
C++ 이동 생성자와 이동 대입 (Move Constructor and Move Assignment)
·
C++/SmartPointer
이동 생성자와 이동 대입 (Move Constructor and Move Assignment) 속도 비교 L-value 레퍼런스와 R-value 레퍼런스의 성능 차이가 꽤 존재한다. R-value 레퍼런스의 경우 Deep Copy를 하지 않기 때문이다. 생성자, 소멸자를 호출하는 부분이 강의와 살짝 달랐는데, 강의는 Release 모드여서 Debug 모드에 비해 단계가 줄어있는 상태여서 그랬다. 나도 x86버전의 Release모드로 컴파일했더니 실행 파일이 없다는 LNK1104 에러가 발생하였다. 백신 문제였는데, x64로 컴파일하니 실행에 문제는 없었다. 이유는 모르겠다. 아래는 Debug 모드로 실행했다. L-value 레퍼런스를 사용한 예제 Copy Constructor, Copy Assignmen..
C++ R-value Reference
·
C++/SmartPointer
R-value Reference R-value L-value와 달리 메모리 주소가 저장되지 않는 값을 의미한다. 예제 주소를 가지고 있지 않은 리터럴 값이나 함수의 반환 값 등을 참조할 수 있다. #include using namespace std; void doSomething(int& ref) { cout
C++ Syntax vs Semantics
·
C++/SmartPointer
Syntax vs Semantics 아래의 코드는 문법(syntax) 상 문제가 없으나, 정수 + 정수와 문자열 + 문자열의 의미(semantics)가 다르다. int x = 1, y = 1; x + y; std::string str1("Hello"), str2(" World"); str1 + str2; Syntax 문법에 잘 맞아서 컴파일이 되는지 Semantics 의미가 무엇인지 Value Semantics (Copy Semantics) Reference Semantics Move Semantics
C++ 스마트 포인터 (Smart Pointer)
·
C++/SmartPointer
스마트 포인터 (Smart Pointer) RAII (Resource Acquisition Is Initialization) C++의 창시자인 스트롭스트룹이 제안한 디자인 패턴이다. C++ RAII(Resource Acquisition Is Initialization)의 해석을 요약하면 다음과 같다. 객체의 유효성에 대해 다음의 관점이 필요하다. 생성이 완료된 객체는 유효한 객체이어야 한다. 즉, 유효하지 않은 객체가 생성되어서는 안 된다. 필요한 자원들을 획득하지 못한 객체는 유효한 객체가 아니다. 대칭성에 의해, 소멸되어서 더 이상 유효하지 않게 된 객체는 어떤 자원도 가지고 있지 않아야 한다. 메모리 누수를 방지하는 기법이다. 동적으로 할당한 메모리, 혹은 파일을 open한 뒤 early retur..