AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为啥?
Posted
技术标签:
【中文标题】AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为啥?【英文标题】:AfxBeginThread corrupts a LPWSTR value inside a class that is passed to the thread function as argument. Why?AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为什么? 【发布时间】:2013-12-06 20:16:10 【问题描述】:看看这段代码:
// 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 方法中获取代码并将其放入上面的代码中,一切正常。但我不想以这种方式解决它。为什么会发生?提前致谢!
【问题讨论】:
AfxBeginThread() 有两种形式,你调用的是我认为的五参数版本:msdn.microsoft.com/en-us/library/s3w9x78e.aspx 向我们展示 DeleteDocument 函数。如果您修改 DeleteDocument 以使其不执行任何操作而直接返回,会发生什么情况?我敢打赌 data->dataSourceName 不会再被破坏了。可能 DeleteDocument 函数会处理数据。 是的,我用的是五参数函数。这有什么问题吗,奥克代尔? data->dataSourceName 在进入 DeleteDocument 线程函数之前已损坏。我知道它是因为我创建了暂停的线程,并且它仅在我恢复它时才开始。因此,我调用 AfxBeginThread,数据-> dataSourceName 已损坏,并且就在我在线程中调用 resume 之后。无论如何,这里是 DeleteDocument 函数: ... PWTools::Data filledData;填充数据 = (PWTools::Data)malloc(sizeof(PWTools::Data));填充数据 = (PWTools::Data*) 数据; ...在上面的代码中,data->aParam1 是可以的,但是 data->dataSourceName 已损坏。 CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);那么 pParam 在哪里呢?? 【参考方案1】:返回指向 C 字符串的指针的函数总是很可疑。它们很难使用,你应该调用 free() 来释放字符串吗?还是删除[]?还是 SysFreeString?还是 LocalFree()?还是不全部释放?我的水晶球很好地猜测了那个函数的样子:
LPWSTR GetActiveDataSourceName()
WCHAR retval[666];
// Do stuff to fill retval
//...
return retval;
这在一段时间内有效,直到您调用一个重新使用存储“retval”的堆栈空间的函数。立即破坏字符串。任何不平凡的函数,AfxBeginThread() 肯定是合格的。
你已经用 [c++] 标记了这个问题,而是返回一个 std::wstring。
【讨论】:
以上是关于AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为啥?的主要内容,如果未能解决你的问题,请参考以下文章