OpenCASCADE의 Handle() 역할 (feat. 스마트 포인터)

김정근·2025년 1월 20일

OpenCASCADE

목록 보기
1/1

일반적인 동적할당 및 해제

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()를 통한 메모리 관리

Handle()은 OpenCASCADE에서 사용하는 스마트 포인터 템플릿입니다

Handle()로 생성된 객체들은 모두 동적으로 생성되고 Handle()을 통해 자동으로 메모리가 관리됩니다.

// OpenCASCADE Handle
Handle(MyClass) ptr = new MyClass();    // 자동 메모리 관리
  • 메모리 관리
    • 객체의 수명 주기를 자동으로 관리
    • 참조 횟수(reference counting)를 추적
    • 더 이상 참조되지 않는 객체를 자동으로 삭제
  • 안전한 객체 접근
    • null 포인터 체크 가능 (IsNull() 메서드)
    • 여러 곳에서 같은 객체를 안전하게 공유

Handle()과 shared_ptr의 관계

cppCopy// OpenCASCADE의 Handle은 shared_ptr과 가장 유사
Handle(MyClass) ptr = new MyClass();
std::shared_ptr<MyClass> ptr2(new MyClass());
// 둘 다 참조 카운팅 방식으로 메모리 관리

Handle()의 사용 범위

// OpenCASCADE 객체에만 사용
Handle(AIS_Shape) shape;        // OK
Handle(std::string) str;        // Error! OpenCASCADE 객체가 아님

// 일반 객체는 표준 스마트 포인터 사용
std::shared_ptr<std::string> str;  // OK

nullptr 체크 방법

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;                        	// 형상
profile
Android 개발자

2개의 댓글

1개의 답글