【问题标题】: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 在哪里呢??

标签: c++ multithreading mfc


【解决方案1】:

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

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

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

你已经用 [c++] 标记了这个问题,而是返回一个 std::wstring。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多