我正在创建一个新线程,在其中传递一个类对象 类demo在.h文件中定义
int threadentry(void* data)
{
demo* inst=(demo*) data;
cout << "Value of inst "<<hex << &inst<< endl;//value is different from below
}
int main()
{
while(1)
{
demo* inst=new demo();
cout << "Value of inst "<<hex << &inst<< endl; //value is coming different from above
HANDLE threads;
DWORD threadId1;
if ((threads = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadentry,
(void *)inst, 0, &threadId1)) == NULL)
return -1;
delete inst;
system("pause");
}
}
我认为值应该不同,因为地址被复制到 threadentry 的数据变量中。我如何检查这些是传递的同一个对象。
最佳答案
代码打印的是指针的地址,而不是对象的地址。涉及到两个指针变量(一个在main()
中声明,另一个是线程函数的参数)所以输出是不同的。从输出语句中删除运算符的地址 &
:
cout << "Value of inst "<<hex << inst << endl;
将所提供对象的所有权交给线程,因为它知道何时使用完它。在发布的代码中,对象在创建线程后被删除,可能导致线程使用悬空指针。将对象的删除从 main 移到线程中。
thread function 的签名是:
DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
);
它必须返回一个值,发布的代码没有。
代码还存在资源泄漏,因为从 CreateThread()
返回句柄没有被关闭。 CloseHandle()
如果线程不需要连接或存储线程句柄,则立即在 std::vector
中连接(例如使用 WaitForSingleObject
)并稍后关闭。
关于c++ - 通过 Threadcreate 传递时指针值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17668752/