2016. 9. 20. 17:14

_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)


2016. 9. 20. 16:49

* shared_ptr


- 참조 카운팅 방식 스마트 포인터

- 가리키고 있는 객체에 대해 소유권을 가지지 않고 참조 카운트만 유지하는 포인터

- 다른 객체를 가리키면서 포인터에 대한 소유권을 공유

- 자원을 참조하는 외부 객체의 개수를 관리하다가 그 개수가 0이 되면 자동 삭제

- STL 컨테이너 사용 가능

- 가비지 컬렉션의 동작과 유사

- 가비지 컬렉션과 차이는 참조 상태가 고리를 이루는 경우는 없앨 수 있음

(서로 다른 두 객체가 서로를 참조)



* unique_ptr


- 소유권 독점 방식을 사용하는 스마트 포인터

- 복사 생성자와 대입 연산자를 제공하지 않음

- 복사할 수 없으며 소유권 이전을 위해 std::move( ) 이용

- 소유권 해제 시점은 포인터 객체가 가리키는 객체의 소멸, 대입연산, reset 메소드 에서 명시적 호출을 통해 값을 변경할 때

- 스스로 포인터의 유일성을 보장



* weak_ptr


- shared_ptr의 순환 참조로 발생하는 문제를 해결하기 위해 사용하는 특수 포인터

- 레퍼런스 카운트에 포함되지 않고 shared_ptr의 객체만 참조

- 약한 참조 (객체가 살아있도록 유지 않고, 객체가 살아있는 동안만 참조 가능)

- expired 함수를 통해 자신이 참조하는 shared_ptr 상태 확인

- 포인터에 대해 직접 접근 불가능하며, 접근을 원하면 lock( ) 을 통해 shared_ptr로 변환 뒤 shared_ptr의 get( )으로 접근

2016. 9. 20. 09:13

- 다양한 상황에서 어떤 스마트 포인터를 사용해야 하는지 아래에 설명


* Exception 안전



* 가비지 컬렉션



* 효율성



* STL 컨테이너



* 어디에 사용해야 하는가?


- 지역변수

- std::unique_ptr을 사용해야 한다 (boost::scoped_ptr)


- 클래스 멤버 변수

- copied_ptr


- STL 컨테이너

- 참조 카운팅, 참조 연결이 되는 포인터 ( 가비지 컬렉션이 되는 포인터 )


- 명시적 소유권 이전 : Owned pointer


- 큰 객체 : Copy on write



2016. 9. 19. 23:16

* 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인지 체크 불가

- 상속 기반의 변환 제한

- 상수 객체에 대한 포인터 지원 제한

- 구현하기 까다로움

- 이해하기 쉽지 않아 유지 보수도 어려움

- 디버깅이 어려움





2016. 9. 19. 20:54

Visual Studio 에서 


메뉴 - 빌드 - 솔루션 빌드 


아래의 메뉴를 보면 현재의 프로젝트의 빌드가 나온다


그 이름으로 솔루션 탐색기에서 소스를 찾으면 된다