본문 바로가기

프로그래밍/MaxSDK

[MAXSDK] 메모리 할당

메모리 할당

개관

3ds 맥스 API 는 플러그인 클래스의 새로운 인스턴스가 요구될 때 메모리를 할당하는 데 사용되는 메서드를 제공한다. 또한 그것은 플러그인 유형에 의존해 이 메모리를 해제하는 몇 가지 서로 다른 방법을 제공하기도 한다. 대부분의 경우 이 메서드들은 ClassDesc::Create() 와 Animatable::DeleteThis() 이다.

메서드들

3ds 맥스가 플러그인 클래스의 새로운 인스턴스를 생성할 필요가 있을 때, 그것은 클래스 기술자의 Create() 메서드를 호출한다. 이 메서드는 플러그인 클래스의 새로운 인스턴스를 반환한다. 클래스를 위한 이 메모리는 아래 보이는 것처럼 new 연산자를 사용해 할당된다 :

    void *Create(BOOL loading = FALSE) { return new MyObject; }

예를 들어 3ds 맥스가 디스크로부터 파일을 로드할 때, 그것은 사용되는 플러그인의 인스턴스를 생성할 필요가 있다(기하 오브젝트, 광원, 카메라, 재질, 컨트롤러 등). 그것은 ClassDesc::Create() 를 호출함으로써 이를 수행한다.

이 메모리는 3ds 맥스가 이 요소의 사용을 마쳤을 때 해제되어야 한다. 보통 DeleteThis() 라는 이름의 메서드가 호출된다. 이 메서드는 플러그인 클래스와 관련된 메모리를 해제하기 위해 호출된다. 메모리는 new 연산자를 사용해 할당되었기 때문에, 그것은 아래처럼 delete 연산자를 사용해 해제되어야 한다.

    void DeleteThis() { delete this; }

Animatable 클래스 계층의 일부인 플러그인에 대해서는 DeleteThis() 가 Animatable 의 메서드이다. Animatable 을 상속하지 않는 플러그인에 대해서는 상속하지 않은 DeleteThis() 가 존재한다. 예를 들어 UtilityObj 클래스는 Animatable 을 상속하지 않는 Utility 플러그인을 생성하는 데 사용되며, 그것은 자신만의 DeleteThis() 메서드를 가진다.

DeleteThis() 메서드는 개발자에게 해제에 대한 제어권을 부여한다. 예를 들어 Utiltity 플러그인 오브젝트는 정적으로 선언되며, 실제로는 힙에서 선언되지 않는다. 이러한 utiltity 플러그인은 해제할 힙 메모리를 가지고 있지 않기 때문에 아무 것도 하지 않는 DeleteThis() 를 구현한다.

    void DeleteThis(){}

\MAXSDK\SAMPLES\UTITLITIES\ASCIIOUT.CPP 코드가 하는 것은 이것 뿐이다.

새로운 플러그인 유형은 DeleteThis() 메서드를 전혀 가지고 있지 않다 -- 3ds 맥스는 메모리를 직접 해제한다. Image Filter 와 (ImageFilter 로부터의 하위클래스인) Compositor 플러그인 유형들은 ClassDesc::Create() 를 사용해 할당되지만, 시스템에 의해 해제되지 않는다. 이 경우 플러그인은 구현할 DeleteThis() 메서드를 가지고 있지 않다. 시스템은 단지 플러그인 상에서 내부적으로 (delete 연산자를 사용해) delete를 호출한다.

 

[출처] - 라이푸님의 http://blog.naver.com/lifeisforu 네이버 블로그