函数完美运行,但返回后更改值

我有一个函数将两个LPCWSTRs连接在一起,方法是将它们转换为wstrings,添加它们,将其转换回来,然后返回该值(取自: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来自其他语言的随机符号之前变成一堆正方形,并且它总是在变化。

例子:

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

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

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)


以上是函数完美运行,但返回后更改值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>