gpt4 book ai didi

c++ - AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为什么?

转载 作者:行者123 更新时间:2023-11-27 23:10:59 29 4
gpt4 key购买 nike

看这段代码:

// Function that start the thread
...
data = (PWTools::Data*)malloc(sizeof(PWTools::Data));
data->aParam1 = aParam1;
data->dataSourceName = pwTools.GetActiveDataSourceName(); //This function returns a LPWSTR
CWinThread* thread = AfxBeginThread(DeleteDocument, (LPVOID)data, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
...

在上面的第 3 行之后,数据已正确填充,没有任何问题。但在第 4 行之后,就在调用 AfxBeginThread 之后,data->dataSourceName 立即损坏并获得无意义的值。我试图获取 GetActiveDataSourceName 方法中的代码并将其放入上面的代码中,一切正常。但我不想这样解决。为什么会这样?提前致谢!

最佳答案

返回指向 C 字符串指针的函数总是很可疑。它们很难使用,你应该调用 free() 来释放字符串吗?或者删除[]?或者 SysFreeString?或者 LocalFree()?还是不全部释放?我的 Crystal 球很好地猜测了这个函数的样子:

LPWSTR GetActiveDataSourceName()
{
WCHAR retval[666];
// Do stuff to fill retval
//...
return retval;
}

这会工作一段时间,直到您调用一个重新使用存储“retval”的堆栈空间的函数。立即破坏字符串。任何重要的函数,AfxBeginThread() 肯定符合条件。

你已经用 [c++] 标记了这个问题,而是返回一个 std::wstring。

关于c++ - AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20432794/

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