Выделение памяти в native для освобождения в управляемом виде накладывает большие затраты на то, чтобы вызывающая сторона точно знала, что они делают. Возможно, вы захотите рассмотреть другие способы выделения памяти в управляемом коде.
Один примерможет быть сделать обратный вызов в управляемый код для получения строкового буфера
extern "C" __declspec void GetString( char* buffer, int bufferSize );
Соответствие C # будет следующим:
void GetString( StringBuilder buffer, int bufferSize );