안녕하세요.
Google ProtoBuf는 서드 파티 플러그인으로, 해당 사항 관련하여 아직까지 공식적으로 수정 계획이 있거나
관련 티켓은 생성되지 않은 것으로 보입니다.
언리얼 엔진은 자체 할당자를 사용하고 있으며
언리얼 외부에서 할당된 메모리를 언리얼 할당자를 통해 삭제하면 보내주신 콜스택과 같이 일반적으로 충돌이 발생합니다.
(반대의 경우에도 마찬가지 입니다)
이를 해결하기 위해 아래와 같은 방법들을 시도할 수 있습니다.
언리얼 엔진은 C++ new(), delete() 연산자를 오버로딩하며, 이는 언리얼 빌드 환경에서만 작동합니다.
따라서 외부 소스 코드를 프로젝트에 포함하고 UBT로 컴파일하면, 라이브러리 내부의 모든
new(), delete() 호출이 링크 단계에서 언리얼 엔진의 전역 operator로 해석될 수 있어 보입니다.
다만, 라이브러리의 구현 방식에 따라 연결이 보장되지 않을 수 있으므로
관련 객체가 생성되고 소멸되는 위치를 디버깅하여 호출이 올바르게 이루어지고 있는지 검증해야 합니다.
ModuleBoilerplate.h와 CL 31807641에서 서드파티 메모리 처리를 언리얼 엔진 방식으로 래핑하는 매크로를 확인할 수 있습니다.
#define UE_DEFINE_FMEMORY_WRAPPERS \
void* FMemory_Malloc ( size_t Size, size_t Alignment) { return FMemory::Malloc( Size ? Size : 1, Alignment ); } \
void* FMemory_Realloc( void* Original, size_t Size, size_t Alignment ) { return FMemory::Realloc(Original, Size ? Size : 1, Alignment ); } \
void FMemory_Free ( void *Ptr) { FMemory::Free( Ptr ); }
일부 서드파티 라이브러리는 Custom Allocator 함수를 제공하며, new()와 delete() 호출에 대해 사용자가 정의한 메모리 할당 함수를 지정할 수 있습니다.
이와 같은 기능을 사용할 수 있다면 위 매크로를 참고하여 구현할 수 있어 보입니다.
https://github.com/iFunFactory/engine-plugin-ue4/commit/bc6faababee22025f5fc8b9107e855b0bc769f1e#diff-654564e4578f56d5651644daff28af09476f4a3a70e2a7975a80a3405671e651
위 플러그인의 funapi_std_allocator.h가 비슷한 예시로 참고하실 수 있습니다.
위 방식 모두 사용하기 어려운 경우 대안으로 MallocAnsi의 사용을 권장 드립니다.
마지막으로 MallocBinned3는 언리얼 엔진 플랫폼에 최적화되어 있고
일반적으로 MallocAnsi보다 더 좋은 성능을 낼 수 있는 것으로 보이지만,
이는 프로젝트에 따라 다르며 정확한 차이를 확인하기 위해서는 언리얼 인사이트를 사용하여 같은 상황에서
프로파일링 하는 것을 권장드립니다.
감사합니다.