AfxBeginThread破坏类中作为参数传递给线程函数的LPWSTR值.为什么?
AfxBeginThread corrupts a LPWSTR value inside a class that is passed to the thread function as argument. Why?
看看这个代码:
// 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方法中,并把它放在上面的代码中,一切都很好。但我不想用这种方式解决它。为什么会发生这种情况?提前感谢!
返回C字符串指针的函数总是非常可疑的。它们很难使用,你应该调用free()来释放字符串吗?或者删除[]?或者SysFreeString?还是LocalFree()?还是不全部发布?我的水晶球对这个功能有一个很好的猜测:
LPWSTR GetActiveDataSourceName()
{
WCHAR retval[666];
// Do stuff to fill retval
//...
return retval;
}
这在一段时间内有效,直到您调用一个函数,该函数重新使用存储"retval"的堆栈空间。立即损坏字符串。任何非平凡的函数,AfxBeginThread()都是合格的。
您已经用[c++]标记了这个问题,请返回std::wstring。
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- C++使用params创建线程函数会导致转换错误
- 为什么std::async使用同一个线程运行函数
- 使用 std::string () const 函数启动线程或未来
- C++线程中,没有重载函数接受 X 参数
- 如何从线程中的不同模块调用函数?
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 如何将类的成员函数传递给线程
- 是否可以创建一个从不同类调用函数的线程?
- 如何制作一个只能在一个线程上同时执行的函数?
- 启动类函数作为失去引用的线程
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 非静态成员失败的线程调用函数
- 线程调用的函数对对象删除是否安全?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 类成员在构造函数(线程)之后更改地址
- C++无限依次运行两个函数(线程)
- c++将各种参数传递给父类构造函数(线程c++11)