在WinRT API中,我必须创建并返回HSTRING值。到目前为止,我一直在使用WindowsCreateString创建HSTRING值并使用WindowsDeleteString手动将其删除。

WindowsCreateStringReference看起来非常方便,因为不必手动删除HSTRING


  您不需要调用WindowsDeleteString函数来取消分配WindowsCreateStringReference函数创建的快速传递HSTRING。


谁能详细说明什么是fast-pass string以及如何以及何时实际取消分配它?

这里出现的另一个问题是,什么时候我应该更喜欢WindowsCreateString而不是WindowsCreateStringReference

最佳答案

“快速通过”字符串不能管理其字符串的生存期,它只是围绕您提供的任何基础字符串创建包装器。该包装器非常轻巧。

这意味着两件事-首先,您不需要删除HSTRING(因为它不拥有基础字符串),但更重要的是,在使用快速传递字符串时,必须保持基础字符串有效且不变。

因此,如果您已经有一个字符串(例如,在rodata节中为const char *,或其他生存期严格大于HSTRING生存期的来源),则它很有用。但这只是为了避免复制而进行的优化。

我的建议-如果您只关心生命周期并在完成后正确释放字符串-请使用Microsoft::WRL::Wrapper::HString类,该类为原始HSTRING提供了一个不错的C ++样式RAII包装,并在完成后会正确释放它们。然后使用成员函数DetachGetGetAddressOf等,然后可以与需要原始HSTRING的其他API进行交互。

如果您也关心速度,那么总会有一个Microsoft::WRL::Wrapper::HStringReference类复制WindowsCreateStringReference功能,但还是要使用一个不错的c ++ RAII对象。

关于c++ - 使用WindowsCreateStringReference和WindowsCreateString进行HSTRING取消分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53719896/

10-11 02:28