Как освободить память структур значений С++ WinRT

Нужно ли и как мне освобождать память из структуры значений, созданной в компоненте среды выполнения Windows, которая была возвращена в управляемый проект C#?

Я объявил структуру

// Custom struct
public value struct PlayerData
{
    Platform::String^ Name;
    int Number;
    double ScoringAverage;
};

подобно

auto playerdata = PlayerData();
playerdata.Name = ref new String("Bla");
return playerdata;

Я новичок в освобождении памяти и понятия не имею, как и когда это освободить. Любой?


person Toine db    schedule 03.03.2016    source источник
comment
@πάντα ῥεῖ К вашему сведению, WinRT = [c++-cx], а не [c++-cli]   -  person Lucas Trzesniewski    schedule 04.03.2016
comment
@LucasTrzesniewski извините за путаницу. Любые комментарии, как освободить память от объектов, которые пересекают границу между компонентом среды выполнения Windows и проектом С#? (например, мои PlayerData)   -  person Toine db    schedule 04.03.2016
comment
не беспокойтесь, я просто указал другому редактору, что он добавил неправильный тег. У меня самого нет опыта работы с WinRT, и я увидел ваш вопрос только из-за тега C++/CLI, поэтому, боюсь, я не могу вам помочь.   -  person Lucas Trzesniewski    schedule 04.03.2016


Ответы (2)


Когда структура значений присваивается другой переменной, ее члены копируются, так что обе переменные имеют собственную копию данных (см. классы и структуры значений (C++/CX)). То же правило применяется при возврате структуры значения из функции.

В вашем коде есть playerdata, объект типа PlayerData с автоматическим сроком хранения. Оператор return создает копию playerdata (включая член Platform::String^) и возвращает эту копию вызывающей стороне. После этого playerdata выходит за рамки и автоматически уничтожается.

Другими словами: опубликованный вами код работает так, как ожидалось. Вам не нужно явно освобождать память.

person IInspectable    schedule 20.03.2016
comment
andy, большое спасибо за ответы, очень понятно. НО оказалось, что мне нужны классы вместо структуры, чтобы получить их из компонента времени выполнения в мой проект С#. Нужно ли освобождать память (классы), которые я создал в компоненте времени выполнения, который вернулся в проект С#? например: github.com/cmusphinx/pocketsphinx- wp-demo/blob/мастер/ - person Toine db; 21.03.2016
comment
@Toinedb: Если у вас есть другой вопрос, нажмите кнопку Задать вопрос. - person IInspectable; 21.03.2016
comment
Хорошо, так и сделаю. Спасибо еще раз - person Toine db; 21.03.2016

Структура playerdata создается в стеке; «новый» не назывался. Он не был создан в куче, поэтому нет необходимости освобождать память.

person Andy Rich    schedule 10.03.2016