gpt4 book ai didi

c++ - 函数运行完美,但返回后值发生变化

转载 作者:行者123 更新时间:2023-12-02 18:42:12 24 4
gpt4 key购买 nike

我有一个函数可以将两个 LPCWSTR 连接在一起,方法是将它们转换为 wstring,将它们相加,再转换回来,然后返回该值(取自: 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 语句之前中断时,调试器显示该值也是正确的。

正确的值应该是:

correct value

当我打破结尾大括号时,lpcwstr 的值会变成一堆在其他语言的 1-5 随机符号之前的方 block ,并且它总是在变化.

示例:

enter image description here enter image description here enter image description here enter image description here

这不需要更改任何代码,只需重置调试器并再次运行即可。我对此进行了数小时的研究,但到目前为止还没有发现任何东西。数组有一个有点类似的问题,据说使用指针而不是面值,但这没有什么区别。为什么变量一返回就会在函数外改变值?

编辑:阅读评论后我将其更改为:

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)

关于c++ - 函数运行完美,但返回后值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67866808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com