功能完美运行,但在 return 后更改值
Function works perfectly but changes value after return
我有一个函数可以将两个 LPCWSTR
连接在一起,方法是将它们转换为 wstring
,添加它们,再将其转换回来,然后 returning 该值(取自: How to concatenate a LPCWSTR?)
LPCWSTR addLPCWSTRs(LPCWSTR lpcwstr1, LPCWSTR lpcwstr2) {
//Add the strings together
std::wstring wstringCombined = std::wstring(lpcwstr1) + std::wstring(lpcwstr2);
//Convert from wstring back to LPCWSTR
LPCWSTR lpcwstrCombined = wstringCombined.c_str();
return lpcwstrCombined;
}
LPCWSTR BaseURL = L"https://serpapi.com/search.json?tbm=isch?q=";
LPCWSTR imageQuery = L"baby+animals";
LPCWSTR URL = addLPCWSTRs(BaseURL, imageQuery);
在 return 语句之前,lpcwstrCombined
值是正确的,当我在 return 语句之前中断时,调试器显示该值也是正确的。
正确的值应该是:
当我在结尾的花括号上打断时,lpcwstr
的值变成了一堆正方形,然后是 1-5
来自其他语言的随机符号,而且它一直在变化。
示例:
并且这没有更改任何代码,只需重置调试器并再次 运行。我已经对此进行了数小时的研究,但到目前为止还没有发现任何东西。数组的一个有点类似的问题据说使用指针而不是面值,但这并没有什么区别。为什么变量一被 returned 就在函数外改变值??
编辑:
看完评论我改成:
std::wstring addLPCWSTRs(LPCWSTR lpcwstr1, LPCWSTR lpcwstr2) {
//Add the strings together
std::wstring wstringCombined = std::wstring(lpcwstr1) + std::wstring(lpcwstr2);
//Convert from wstring back to LPCWSTR
return wstringCombined;
}
LPCWSTR BaseURL = L"https://serpapi.com/search.json?tbm=isch?q=";
LPCWSTR imageQuery = L"baby+animals";
LPCWSTR URL = addLPCWSTRs(BaseURL, imageQuery).c_str();
同样的问题仍然存在!
问题是对内存寿命的误解。在您的第一个示例中,您有一个悬空指针:
std::wstring combined = ...
// Here you create the string (importantly, its memory)
LPCWSTR lpcwstrCombined = wstringCombined.c_str();
// Make a pointer to the string
return lpcwstrCombined;
// return the pointer
} // end of function the string is destroyed, including it's memory being freed
在你的第二个例子中,你做了同样的事情,只是方式不同:
LPCWSTR URL = addLPCWSTRs(BaseURL, imageQuery).c_str();
// ^ This is a temporary, at the end of this statement, it will be
// destroyed along with its memory.
你需要保持 wstring
左右:
std::wstring string_storage = addLPCWSTRs(BaseURL, imageQuery);
LPCWSTR URL = string_storage.c_str();
然后您可以使用 URL 作为字符串的范围。
这意味着不要做这样的事情:
LPCWSTR URL;
{
std::wstring string_storage = addLPCWSTRs(BaseURL, imageQuery);
URL = string_storage.c_str();
} // string is destoryed leaving a dangling pointer (just to get you a third
// time)
我有一个函数可以将两个 LPCWSTR
连接在一起,方法是将它们转换为 wstring
,添加它们,再将其转换回来,然后 returning 该值(取自: How to concatenate a LPCWSTR?)
LPCWSTR addLPCWSTRs(LPCWSTR lpcwstr1, LPCWSTR lpcwstr2) {
//Add the strings together
std::wstring wstringCombined = std::wstring(lpcwstr1) + std::wstring(lpcwstr2);
//Convert from wstring back to LPCWSTR
LPCWSTR lpcwstrCombined = wstringCombined.c_str();
return lpcwstrCombined;
}
LPCWSTR BaseURL = L"https://serpapi.com/search.json?tbm=isch?q=";
LPCWSTR imageQuery = L"baby+animals";
LPCWSTR URL = addLPCWSTRs(BaseURL, imageQuery);
在 return 语句之前,lpcwstrCombined
值是正确的,当我在 return 语句之前中断时,调试器显示该值也是正确的。
正确的值应该是:
当我在结尾的花括号上打断时,lpcwstr
的值变成了一堆正方形,然后是 1-5
来自其他语言的随机符号,而且它一直在变化。
示例:
并且这没有更改任何代码,只需重置调试器并再次 运行。我已经对此进行了数小时的研究,但到目前为止还没有发现任何东西。数组的一个有点类似的问题据说使用指针而不是面值,但这并没有什么区别。为什么变量一被 returned 就在函数外改变值??
编辑: 看完评论我改成:
std::wstring addLPCWSTRs(LPCWSTR lpcwstr1, LPCWSTR lpcwstr2) {
//Add the strings together
std::wstring wstringCombined = std::wstring(lpcwstr1) + std::wstring(lpcwstr2);
//Convert from wstring back to LPCWSTR
return wstringCombined;
}
LPCWSTR BaseURL = L"https://serpapi.com/search.json?tbm=isch?q=";
LPCWSTR imageQuery = L"baby+animals";
LPCWSTR URL = addLPCWSTRs(BaseURL, imageQuery).c_str();
同样的问题仍然存在!
问题是对内存寿命的误解。在您的第一个示例中,您有一个悬空指针:
std::wstring combined = ...
// Here you create the string (importantly, its memory)
LPCWSTR lpcwstrCombined = wstringCombined.c_str();
// Make a pointer to the string
return lpcwstrCombined;
// return the pointer
} // end of function the string is destroyed, including it's memory being freed
在你的第二个例子中,你做了同样的事情,只是方式不同:
LPCWSTR URL = addLPCWSTRs(BaseURL, imageQuery).c_str();
// ^ This is a temporary, at the end of this statement, it will be
// destroyed along with its memory.
你需要保持 wstring
左右:
std::wstring string_storage = addLPCWSTRs(BaseURL, imageQuery);
LPCWSTR URL = string_storage.c_str();
然后您可以使用 URL 作为字符串的范围。
这意味着不要做这样的事情:
LPCWSTR URL;
{
std::wstring string_storage = addLPCWSTRs(BaseURL, imageQuery);
URL = string_storage.c_str();
} // string is destoryed leaving a dangling pointer (just to get you a third
// time)