Graphisoft®

API Development KitVersion: 18

메모리 관리자


많은 API 함수는 특별한 방식으로 할당된 동적 메모리를 필요로 합니다. 이 메모리 블록은 GSHandle들에 의해 처리됩니다.

Macintosh 툴박스는 메모리 관리자가 핸들을 사용하기 때문에 필요합니다. 기본적으로 핸들은 포인터의 포인터입니다.

<MacMemory.h> 헤더에서 인용하였습니다:

"Mac OS X에서 메모리 관리자와 heap의 동작은 일반적으로 Mac OS 9.x 및 이전 버전과 다릅니다. 특히, Mac OS X의 heap은 결코 축출되거나 압축되지 않습니다. 따라서, 잠금 해제된 핸들은 SetHandleSize()를 호출함으로써 직접적인 액션의 결과나 그것에 데이터를 추가하기 위해 손잡이를 암묵적으로 리사이즈하는 PtrAndHand()와 같은 함수을 사용하는 것 외에는 결코 재배치되지 않을 것입니다. 이로 인해 대부분의 핸들 잠금 및 잠금 해제는 Mac OS X에서 불필요하며 HLock() 및 기타 함수들의 사용이 권장되지 않습니다. 만약 당신이 MacMemory.h를 포함하기 전에 당신의 소스에 __MAC_OS_X_MEMORY_MANAGER_CLEAN__라는 매크로를 1로 정의하면, HLock()과 다른 여러 함수들이 빈 동작을 하게 되어 함수 호출의 오버헤드가 제거됩니다."

__MAC_OS_X_MEMORY_MANAGER_CLEAN__은 GSRoot 모듈에서 세트되지 않는다는 것을 참고하십시오!

Examples:
    API_Coord   **hh = NULL;

    hh = (API_Coord **) BMhAll (20 * sizeof (API_Coord));
    if (hh != NULL && BMError () == NoError) {
        // 안전한 디레퍼런스
        (*hh)[15].x = -32.56;
        (*hh)[15].y =  0.127;

        // 이것 역시 안전함
        CalcArea (hh);               // 마스터 포인터가 아닌 핸들을 전달함!

        // 할당된 메모리 처분함
        BMhKill ((GSHandle *) &hh);
    }

핸들에서 작동하기 위해 GSRoot 패키지의 BMxxx 함수들을 사용하십시오. malloc이 할당한 일반 포인터의 주소를 파라미터로 전달하지 마십시오. 여기서 ArchiCAD는 핸들을 필요로 합니다. 또한 디레퍼런스된 값에서 free 함수를 호출하는 핸들을 해제하려고 하지 마십시오. 이 경우 애드온이 손상됩니다.

이러한 함수들은 필요한 파라미터들에 주어진 structure들을 통해 핸들들을 처분합니다. API의 후기 버전에서 structure들의 정의가 변경될 수 있으므로 핸들들을 하나씩 처분하는 대신 사용해야 합니다.

ACAPI_DisposeAddParHdl
ACAPI_DisposeAttrDefsHdls
ACAPI_DisposeBeamRelationHdls
ACAPI_DisposeElemMemoHdls
ACAPI_DisposeRoomRelationHdls
ACAPI_DisposeWallRelationHdls