c++의 일반적인 메모리 동적할당과 메모리 해제는 다음과 같이 이루어집니다.
// 일반 동적 할당
MyClass* ptr = new MyClass(); // 수동 메모리 관리
delete ptr;
스마트 포인터는 일반 포인터를 더 안전하게 사용할 수 있도록 도와주는 객체입니다. 가장 큰 특징은 메모리를 자동으로 관리해준다는 것입니다.
// 1. unique_ptr: 단독 소유
std::unique_ptr<MyClass> ptr1(new MyClass());
// ptr1만 이 객체를 소유하고 관리할 수 있음
// 2. shared_ptr: 공유 소유
std::shared_ptr<MyClass> ptr2(new MyClass());
std::shared_ptr<MyClass> ptr3 = ptr2;
// ptr2와 ptr3가 같은 객체를 공유
// 3. weak_ptr: 약한 참조
std::weak_ptr<MyClass> ptr4 = ptr2;
// ptr2가 해제되면 ptr4도 자동으로 무효화
Handle()은 OpenCASCADE에서 사용하는 스마트 포인터 템플릿입니다
Handle()로 생성된 객체들은 모두 동적으로 생성되고 Handle()을 통해 자동으로 메모리가 관리됩니다.
// OpenCASCADE Handle
Handle(MyClass) ptr = new MyClass(); // 자동 메모리 관리
cppCopy// OpenCASCADE의 Handle은 shared_ptr과 가장 유사
Handle(MyClass) ptr = new MyClass();
std::shared_ptr<MyClass> ptr2(new MyClass());
// 둘 다 참조 카운팅 방식으로 메모리 관리
// OpenCASCADE 객체에만 사용
Handle(AIS_Shape) shape; // OK
Handle(std::string) str; // Error! OpenCASCADE 객체가 아님
// 일반 객체는 표준 스마트 포인터 사용
std::shared_ptr<std::string> str; // OK
cppCopy// 일반 포인터
if (ptr != nullptr) { ... }
// shared_ptr
if (ptr) { ... }
// Handle
if (!shape.IsNull()) { ... }
OpenCASCADE에서 Handle()을 사용하는 주요 객체들
Handle(Aspect_DisplayConnection) displayConnection; // 디스플레이 연결
Handle(OpenGl_GraphicDriver) graphicDriver; // 그래픽 드라이버
Handle(V3d_Viewer) viewer; // 3D 뷰어
Handle(WNT_Window) wntWindow; // 윈도우
Handle(V3d_View) aView; // 뷰
Handle(AIS_InteractiveContext) context; // 상호작용 컨텍스트
Handle(AIS_Shape) aisShape; // 형상
굳