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

时间:2013-12-06 20:16:10

标签: c++ multithreading mfc

看看这段代码:

// 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方法中获取代码并将其放在上面的代码中,一切正常。但我不想这样解决它。为什么会这样?提前谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

在你调用一个重用了存储“retval”的堆栈空间的函数之前,它会工作一段时间。瞬间腐蚀弦乐。任何非平凡的函数AfxBeginThread()当然都符合条件。

您已使用[c ++]标记此问题,而是返回std :: wstring。