使用此关键字在结构中引用类时出现问题

Trouble referencing class in structure using this keyword

本文关键字:问题 引用 关键字 结构      更新时间:2023-10-16

>头文件:

// Free function to use in thread
unsigned int __stdcall WorkerFunction(void *);
class MyClass {
    public:
        int temp;
        void StartThread();
}
typedef struct {
    MyClass * cls;
} DATA;

CPP类:

void MyClass::StartThread() {
    temp = 1234;
    DATA data = {this};
    HANDLE hThread = (HANDLE) _beginthreadex(0, 0, &WorkerFunction, &data, 0, 0);
    // Commented out for now while I address the current problem
    //CloseHandle(hThread);
}
unsigned int __stdcall WorkerFunction(void * param0) {
    MessageBox(NULL, "WorkerFunction()", "Alert", MB_OK);
    DATA * data = (DATA *) param0;
    MyClass* cls0 = data->cls;
    // Crashes when reference to cls0 is attempted.
    char buf[5];
    snprintf(buf, 5, "%i", cls0 ->temp);
    MessageBox(NULL, buf, "Alert", MB_OK);
}

这里有一个简单的问题,我不能把我的手指放在上面。

  • 我有一个线程的参数,它传递一个包含类的结构。
  • 我用this实例化结构,然后在线程启动时传递它
  • 我尝试在工作线程函数中取消引用(?)它。
  • 此时,一切编译正常。
  • 当我添加行以访问类中的某些内容时,应用程序崩溃。

我的错误在哪里?

您正在传递一个局部堆栈变量,该变量在返回StartThread()时超出范围。因此,您引用的堆栈空间不再属于您。

void MyClass::StartThread() {
    temp = 1234;
    DATA data = {this}; // << LOCAL VARIABLE OUT OF SCOPE ON FUNCTION EXIT
    HANDLE hThread = (HANDLE) _beginthreadex(0, 0, &WorkerFunction, &data, 0, 0);
    // Commented out for now while I address the current problem
    //CloseHandle(hThread);
}

要么动态分配数据,要么更好的是,使数据成为MyClass的成员,并将this作为线程数据传递。在您的情况下,您只是通过结构传递 *this,因此只需将其作为参数传递即可

void MyClass::StartThread() {
    temp = 1234;
    HANDLE hThread = (HANDLE) _beginthreadex(0, 0, &WorkerFunction, this, 0, 0);
    // Commented out for now while I address the current problem
    //CloseHandle(hThread);
}

在您的线程进程中:

unsigned int __stdcall WorkerFunction(void * param0) {
    MessageBox(NULL, "WorkerFunction()", "Alert", MB_OK);
    MyClass* cls0 = static_cast<MyClass*>(param0);
   etc...
}

无论传递给线程过程什么,它都必须在所需的持续时间内具有有效的生存期。 按线程。要么确保通过将动态分配的所有权传递给线程,让它执行删除,要么在线程进程中传递一个已知的保持确定状态的指针。它似乎this满足后者,所以你应该很高兴。