Да, в этом случае Маршалл означает копию; Таким образом, вам необходимо освободить память в неуправляемом коде. Все, что делает вызов PtrToStructure, - это считывает количество байтов, обозначенных размером структуры назначения «MyDataStructure», из ячейки памяти, на которую указывает pData.
Детали, конечно, зависят от того, как именно выглядит «MyDataStructure» (используете ли вы какие-либо атрибуты FieldOffset или StructLayout в MyDataStructure) - но конечный результат заключается в том, что возврат из PtrToStructure является копией данных.
Поскольку GBegen указывает на его ответ , я не ответил на основной вопрос вашего вопроса. Да, вам нужно будет удалить неуправляемую копию вашей структуры в неуправляемом коде, но нет, вам не нужно удерживать pData - вы можете удалить неуправляемую копию, как только завершится вызов PtrToStructure.
PS: я отредактировал свой пост, чтобы он содержал эту информацию, с тем чтобы объединить ответы в один пост - если кто-то проголосует против этого ответа, просьба также подтвердить ответ GBegen за его вклад.