AfxBeginThread破坏类中作为参数传递给线程函数的LPWSTR值.为什么?

AfxBeginThread corrupts a LPWSTR value inside a class that is passed to the thread function as argument. Why?

本文关键字:函数 线程 LPWSTR 为什么 参数传递 AfxBeginThread      更新时间:2023-10-16

看看这个代码:

// 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()?还是不全部发布?我的水晶球对这个功能有一个很好的猜测:

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

这在一段时间内有效,直到您调用一个函数,该函数重新使用存储"retval"的堆栈空间。立即损坏字符串。任何非平凡的函数,AfxBeginThread()都是合格的。

您已经用[c++]标记了这个问题,请返回std::wstring。