【问题标题】:How to free memory of c++ WinRT value structs如何释放 C++ WinRT 值结构的内存
【发布时间】:2016-06-17 07:47:25
【问题描述】:

我是否必须以及如何从已返回到托管 C# 项目的 Windows 运行时组件中创建的值结构释放内存?

我声明了结构

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

喜欢

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

我是释放内存的新手,不知道如何以及何时释放它。 任何人?

【问题讨论】:

  • @πάντα ῥεῖ 仅供参考,WinRT = [c++-cx],而不是 [c++-cli]
  • @LucasTrzesniewski 很抱歉混淆了。任何 cmets 如何从跨越 Windows 运行时组件和 C# 项目之间边界的对象中释放内存? (就像我的 PlayerData)
  • 别担心,我只是向另一位编辑指出他添加了错误的标签。我本人对 WinRT 没有经验,只看到你的问题是因为 C++/CLI 标签,所以我恐怕帮不了你。

标签: c# windows-runtime c++-cx winrt-component


【解决方案1】:

当一个值结构被分配给另一个变量时,它的成员被复制,所以两个变量都有自己的数据副本(参见Value classes and structs (C++/CX))。从函数返回值结构时,同样的规则也适用。

在您的代码中,您有 playerdata,这是一个 PlayerData 类型的对象,具有自动存储持续时间。 return 语句复制playerdata(包括Platform::String^ 成员),并将该副本返回给调用者。之后,playerdata 超出范围,并被自动销毁。

换句话说:您发布的代码按预期工作。您不必显式释放任何内存。

【讨论】:

  • 和安迪,非常感谢您的回答,非常清楚。但事实证明,我需要类而不是结构,才能将它们从运行时组件转移到我的 c# 项目。我是否需要释放我在运行时组件中创建的返回 c# 项目的内存(类)?喜欢:github.com/cmusphinx/pocketsphinx-wp-demo/blob/master/…
  • @Toindb:如果您还有其他问题,请点击 按钮。
  • 好的,会这样做。再次感谢
【解决方案2】:

playerdata 结构体在栈上创建;没有调用“新”。它不是在堆上创建的,所以没有需要释放的内存。

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2023-03-15
    • 2010-09-30
    相关资源
    最近更新 更多