我刚开始使用GDI +,会有很多转换。
我绘制的文本作为一堆随机符号出现一瞬间。我将问题追溯到转换。
代码在底部更新
const wchar_t* convert::stringToWideChar(string String) {
wstring wideString;
for(int i = 0; i < String.length(); i++)
wideString += wchar_t( String[i] );
return wideString.c_str();
}
用作:
testing = "Two Two";
const wchar_t* buf = convert::stringToWideChar(testing);
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);
背景是最初绘制文本的方式。 &#34;等级0&#34;是应该初步绘制的。 (在屏幕截图中,初始文本应该褪色。)
更快地进行转换的想法是什么? (最奇怪的是它只发生在随机的特定字符串上,即&#34;两个&#34;工作,&#34;二个&#34;,没有&#39;&#34;两个太多&#34;,确实
更新
wstring convert::stringToWideChar(string String) {
wstring wideString;
for(int i = 0; i < String.length(); i++)
wideString += wchar_t(String[i] );
return wideString;
}
用作:
const wchar_t* buf = convert::stringToWideChar("leveljjj").c_str();
答案 0 :(得分:1)
Re:您的更新代码;
自动变量和临时变量之间的生命周期存在差异。
自动变量在函数中声明,并将持续到范围结束。
临时只会持续到它所属的表达式的结尾。
一个例子;
testing = "Two Two";
const wchar_t* buf = convert::stringToWideChar("leveljjj").c_str();
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);
在这种情况下,stringToWideChar返回的字符串是临时的。它只会持续到它作为一个部分的表达式完成,直到赋值行结束。它将在path.AddString行之前销毁。
如果你另一方面做了这个;
testing = "Two Two";
std::wstring value = convert::stringToWideChar("leveljjj");
const wchar_t* buf = value.c_str();
path.AddString(buf, wcslen(buf), &gFontFamily, FontStyleBold, 72, ptOrg, &strFormat);
... value是一个自动变量,一直持续到范围结束。这意味着,使用返回的缓冲区是安全的,因为变量对AddString行仍然有效。
答案 1 :(得分:1)
在更新的代码中,c_str()调用将返回一个指向临时对象(rvalue)的指针,该对象在分号处被销毁。
你需要这样的东西:
void stringToWideChar(string String, char* destination) {
wstring wideString;
for(int i = 0; i < String.length(); i++)
wideString += wchar_t(String[i] );
memcpy(destination, wideString.c_str(), strlen(wideString.c_str));
}
确保预先分配您的buf,填写0(以获得0终止)等。
答案 2 :(得分:0)
如果您更改转换函数以返回wstring,则会删除代码中的悬空引用。