似乎我的代码在以下方法中执行了很多new/delete
以将C字符串转换为Platform::String
(每半秒执行一次,文本大约为100-200KB,即由第三方C代码累积)
String^ ToPlatformString(const char* str)
{
if (str == nullptr)
return nullptr;
auto length = strlen(str);
wchar_t * wcstr = new wchar_t[length + 1];
size_t num_converted = 0;
mbstowcs_s(&num_converted, wcstr, length + 1, str, _TRUNCATE);
auto res = ref new String(wstr);
delete[] wstr;
return res;
}
我知道在内部,Platform::String
构造函数基本上是传递的字符串wstr
的新副本。有没有办法消除这种冗余?请注意,如果已销毁,我还希望Platform::String
实例释放已分配的数据。
答案 0 :(得分:0)
正如您的标题所示,您最好的选择是StringReference内置类型。这里有很好的文档记录:
https://docs.microsoft.com/en-us/cpp/cppcx/strings-c-cx#stringreference
使用此方法的成功将取决于您的使用模式,主要是由于StringReference的两个限制:
所以你可以逃避这样的事情:
void UseAsPlatformString(wchar_t *wcstr)
{
Platform::StringReference ref(wcstr);
AFunction(ref.GetString()); // GetString() not required, shown for clarity.
}
void AFunction(Platform::String ^arg)
{
// Do something with arg.
// Don't do this:
// Platform::String ^ref2 = arg;
}
你想要调用什么函数需要直接对传入的字符串进行操作,ad不要对字符串进行其他引用,这会将引用计数推到1以上。我的理解是,如果计数超过1,那么a将复制。