通过Threadcreate传递时,指针值会发生变化

Eul*_*ler 3 c++ multithreading pointers

我正在创建一个新线程,我在其中传递一个类类的对象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");
}
}
Run Code Online (Sandbox Code Playgroud)

我认为值应该是不同的,因为地址被复制到threadentry的数据变量中.如何检查这些是否是传递的对象.

hmj*_*mjd 5

代码打印指针的地址,而不是对象的地址.有两个指针变量(一个是声明的main(),另一个是线程函数的参数)所以输出是不同的.&从输出语句中删除运算符的地址:

cout << "Value of inst  "<<hex << inst << endl;
Run Code Online (Sandbox Code Playgroud)

将提供的对象的所有权授予线程,因为它知道何时完成使用它.在发布的代码中,在创建线程后删除对象,可能导致线程使用悬空指针.将对象的删除从main移动到线程中.

线程函数的签名是:

DWORD WINAPI ThreadProc(
  _In_  LPVOID lpParameter
);
Run Code Online (Sandbox Code Playgroud)

它必须返回一个值,发布的代码不会.

由于返回的句柄CreateThread()未被关闭,因此代码也有资源泄漏.或者CloseHandle()立即如果线程不需要与被接合或存储线程句柄,在std::vector例如,用(使用被接合WaitForSingleObject例如)和后面封闭.