看看这段代码:
// 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方法中获取代码并将其放在上面的代码中,一切正常。但我不想这样解决它。为什么会这样?提前谢谢!
答案 0 :(得分:4)
返回指向C字符串的指针的函数总是非常可疑。它们很难使用,你应该调用free()来释放字符串吗?或者删除[]?还是SysFreeString?还是LocalFree()?还是不释放它?我的水晶球很好地猜测了这个功能是什么样的:
LPWSTR GetActiveDataSourceName()
{
WCHAR retval[666];
// Do stuff to fill retval
//...
return retval;
}
在你调用一个重用了存储“retval”的堆栈空间的函数之前,它会工作一段时间。瞬间腐蚀弦乐。任何非平凡的函数AfxBeginThread()当然都符合条件。
您已使用[c ++]标记此问题,而是返回std :: wstring。