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 值。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Snakemake:将命令行参数传递给脚本。

如何将数组作为参数传递给另一个脚本?

如何将 unique_ptr 对象作为参数传递给作为库的类

MVC - 将整个模型作为参数传递给 JavaScript 中的 Url.Action

将列表作为参数传递给 Python C 模块?

当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]