> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PlayFab Unified SDK에서 메모리 관리

> PFMemoryHooks 사용자 지정 할당자, 안전한 XAsyncBlock 수명 패턴, 명시적 핸들 정리를 통해 PlayFab Unified SDK에서 메모리를 관리합니다.

이 가이드에서는 PlayFab Unified SDK에서 메모리가 관리되는 방식을 사용자 지정 옵션과 메모리 누수를 방지하고 비동기 작업의 안전한 처리를 보장하기 위한 모범 사례를 포함하여 설명합니다.

## 개요

PlayFab Unified SDK는 **사용자 지정 할당 후크**, **명시적 리소스 정리**, **안전한 비동기 작업 처리**를 지원하여 개발자에게 메모리 사용에 대한 정확한 제어를 제공합니다. 따라서 게임 및 임베디드 플랫폼과 같은 고성능 또는 리소스가 제한된 환경에 적합합니다.

## 사용자 지정 메모리 할당

SDK를 사용하면 `PFMemoryHooks`를 사용하여 사용자 지정 메모리 할당 및 해제 함수를 정의할 수 있습니다. 이를 통해 SDK를 아레나, 풀 또는 플랫폼별 할당자와 같은 기존 메모리 관리 시스템에 통합할 수 있습니다.

### 사용자 지정 메모리 후크 설정

```cpp theme={null}
void* MyCustomAlloc(size_t size, uint32_t memoryTypeId);
void MyCustomFree(void* ptr, uint32_t memoryTypeId);

PFMemoryHooks memoryHooks = { MyCustomAlloc, MyCustomFree };
PFMemSetFunctions(&memoryHooks);
PFServicesInitialize(nullptr); // Must be called after setting memory hooks
```

**참고:**

* 후크는 `PFServicesInitialize`를 호출하기 **전에** 설정해야 합니다.
* SDK가 초기화되면 **변경할 수 없습니다**.
* 설정되지 않은 경우 SDK는 기본 할당(`malloc`/`free`)을 사용합니다.

## 비동기 작업

SDK의 대부분의 API 호출은 비동기입니다. 각 비동기 호출은 요청 기간 동안 유효한 상태로 유지되어야 하는 유효한 `XAsyncBlock`이 필요합니다.

### `XAsyncBlock`을 안전하게 사용

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->callback = [](XAsyncBlock* block)
{
    // Retrieve result, then delete asyncBlock if needed
};
StartAsyncPlayFabCall(asyncBlock.get());
asyncBlock.release(); // Ownership passed; handle lifetime carefully
```

**모범 사례:**

* 수명을 보장할 수 없는 한 `XAsyncBlock`을 스택에 할당하지 마세요.
* 동적으로 할당된 경우 소유권을 해제하고 콜백에서 정리하세요.
* 람다에서 무효화된 참조나 포인터를 캡처하지 마세요.

## 리소스 정리

SDK는 더 이상 필요하지 않을 때 명시적으로 닫아야 하는 핸들(예: `PFEntityHandle`, `PFServiceConfigHandle`)을 사용합니다.

### 핸들 닫기 및 초기화 해제

```cpp theme={null}
PFEntityCloseHandle(entityHandle);
PFServiceConfigCloseHandle(serviceConfigHandle);

// Gracefully uninitialize the SDK
XAsyncBlock async{};
PFServicesUninitializeAsync(&async);
XAsyncGetStatus(&async, true); // Blocks until cleanup completes
```

**중요:**

* 누수를 방지하기 위해 항상 PlayFab 핸들을 닫으세요.
* 종료하기 전에 `PFServicesUninitializeAsync`가 완료될 때까지 기다리세요.

## 모범 사례

* **메모리 후크를 조기에 설정**: 다른 PlayFab API 호출 전에.
* **메모리 누수 방지**: 핸들을 닫고 비동기 리소스를 신중하게 관리하세요.
* **메모리 프로파일러 사용**: 특히 메모리 예산이 빡빡한 플랫폼에서.
* **풀링된 할당자 사용**: 성능이 중요하거나 빈번한 할당을 위해.

## 참고

* [비동기 작업](/services/playfab/sdks/unified-sdk/async-model)
* [메모리 관리](/services/playfab/sdks/unified-sdk/memory-management)
* [추적 및 진단](/services/playfab/sdks/unified-sdk/debug-trace)


## Related topics

- [PlayFab Unified SDK에서 디버그 추적](/ko/services/playfab/sdks/unified-sdk/debug-trace.md)
- [PlayFab Unified SDK에서 비동기 호출 수행](/ko/services/playfab/sdks/unified-sdk/async-model.md)
- [2025년 10월 GDK를 사용한 Game Saves 구현](/ko/services/playfab/player-progression/game-saves/october-2025-gdk-changes.md)
- [PlayFab 독립 실행형 SDK v1에서 Unified SDK v2로 마이그레이션](/ko/services/playfab/sdks/unified-sdk/migrating-from-v1.md)
- [메모리 후킹](/ko/services/playfab/sdks/c/memory.md)
