_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS
_SCL_SECURE_NO_DEPRECATE
_SCL_SECURE_NO_WARNINGS
VTK_IN_VTK
CMAKE_INTDIR="Release"
vtkRenderingCore_INCLUDE=
"D:/VTK/CMakeFiles/vtkRenderingCore_AUTOINIT_vtkInteractionStyle_vtkRenderingFreeType_vtkRenderingOpenGL2.h"
vtkRenderingVolume_AUTOINIT=1(vtkRenderingVolumeOpenGL2)
* shared_ptr
- 참조 카운팅 방식 스마트 포인터
- 가리키고 있는 객체에 대해 소유권을 가지지 않고 참조 카운트만 유지하는 포인터
- 다른 객체를 가리키면서 포인터에 대한 소유권을 공유
- 자원을 참조하는 외부 객체의 개수를 관리하다가 그 개수가 0이 되면 자동 삭제
- STL 컨테이너 사용 가능
- 가비지 컬렉션의 동작과 유사
- 가비지 컬렉션과 차이는 참조 상태가 고리를 이루는 경우는 없앨 수 있음
(서로 다른 두 객체가 서로를 참조)
* unique_ptr
- 소유권 독점 방식을 사용하는 스마트 포인터
- 복사 생성자와 대입 연산자를 제공하지 않음
- 복사할 수 없으며 소유권 이전을 위해 std::move( ) 이용
- 소유권 해제 시점은 포인터 객체가 가리키는 객체의 소멸, 대입연산, reset 메소드 에서 명시적 호출을 통해 값을 변경할 때
- 스스로 포인터의 유일성을 보장
* weak_ptr
- shared_ptr의 순환 참조로 발생하는 문제를 해결하기 위해 사용하는 특수 포인터
- 레퍼런스 카운트에 포함되지 않고 shared_ptr의 객체만 참조
- 약한 참조 (객체가 살아있도록 유지 않고, 객체가 살아있는 동안만 참조 가능)
- expired 함수를 통해 자신이 참조하는 shared_ptr 상태 확인
- 포인터에 대해 직접 접근 불가능하며, 접근을 원하면 lock( ) 을 통해 shared_ptr로 변환 뒤 shared_ptr의 get( )으로 접근
- 다양한 상황에서 어떤 스마트 포인터를 사용해야 하는지 아래에 설명
* Exception 안전
* 가비지 컬렉션
* 효율성
* STL 컨테이너
* 어디에 사용해야 하는가?
- 지역변수
- std::unique_ptr을 사용해야 한다 (boost::scoped_ptr)
- 클래스 멤버 변수
- copied_ptr
- STL 컨테이너
- 참조 카운팅, 참조 연결이 되는 포인터 ( 가비지 컬렉션이 되는 포인터 )
- 명시적 소유권 이전 : Owned pointer
- 큰 객체 : Copy on write
* C++에서 스마트 포인터를 사용하는 공통적인 이유
- 적은 버그
- 스마트 포인터를 사용함으로써 코드의 크기를 줄일 수 있다
- 이보다는 버그를 줄일 수 있는 것이 더 중요한 이유
- 스마트 포인터를 사용할 때는 delete를 명시적으로 호출할 필요가 없으므로 메모리 해제에 대해서는 잊어도 됨
- 자동 초기화
- nullptr로 초기화 하지 않아도 됨
- 디폴트 생성자가 자동으로 생성
- auto_ptr을 사용할 때 auto_ptr이 복사되는 경우 대입되는 객체가 nullptr로 설정됨
- auto_ptr이 아닌 다른 스마트 포인터들은 복사가 될 때 다른 행동을 함
- 예를 들어 다른 스마트 포인터에서는 q = p 문을 실행할 때 q와 p가 동일한 스마트 포인터인 경우 다음과 같은 전략을 취할 수도 있음
- 새로운 복사본 생성 : p가 가리키고 있는 객체에 대한 복사본을 새로 생성한 다음 q가 가리키도록 하는 전략 (copied_ptr.h)
- 소유권 이전 : p와 q가 동일한 객체를 가리키도록 하지만 해제에 관한 소유권을 p에서 q로 이전하는 전략 (owned_ptr.h)
- 참조 카운트 : 동일한 객체를 가리키고 있는 스마트 포인터의 개수를 유지하는 전략, 참조 카운트가 0이 되는 순간 객체를 삭제, q = p 문은 p가 가리키고 있는 객체의 카운트 값을 1 증가 (counted_ptr.h)
- 참조 연결 : 참조 카운트 방식과 비슷, 동일한 객체를 가리키는 모든 스마트 포인터를 circular doubly linked list로 연결 (linked_ptr.h)
- Copy on write : 참조 카운트 혹은 참조 연결 방식은 가리키고 있는 객체가 수정되지 않는 동안 사용, 수정이 필요할 때 새로운 복사본을 생성한 뒤에 복사본에 수정하는 방식 (cow_ptr.h>
- scoped_ptr, shared_array 등
- 매개 변수 목록이 아닌 별도 코드 줄에서 스마트 포인터를 만들어야 특정 매개 변수 목록 할당 규칙으로 인해 아주 작은 리소스 누수도 발생하지 않음
* 단점
- 스마트 포인터가 nullptr인지 체크 불가
- 상속 기반의 변환 제한
- 상수 객체에 대한 포인터 지원 제한
- 구현하기 까다로움
- 이해하기 쉽지 않아 유지 보수도 어려움
- 디버깅이 어려움
Visual Studio 에서
메뉴 - 빌드 - 솔루션 빌드
아래의 메뉴를 보면 현재의 프로젝트의 빌드가 나온다
그 이름으로 솔루션 탐색기에서 소스를 찾으면 된다