使用此关键字的麻烦引用类结构(Trouble referencing class in struct

2019-09-29 05:33发布

头文件:

// 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 ,然后通过它的线程启动时
  • 我试图取消引用(?),它在工作器功能。
  • 在这一点上,一切都OK编译。
  • 当我添加行访问的东西在课堂上,应用程序崩溃。

哪里是我的错?

Answer 1:

你传递一个局部堆栈变量,超出范围的时刻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作为线程数据。 在你的案件你只是路过*这个反正通过结构,所以只是把它作为帕拉姆

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);
}

而在你的线程PROC:

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

   etc...
}

无论你传递给你的线程程序,它必须具有所需要的时间有效寿命。 由线程。 无论是确保通过传递一个动态分配的所有权转让给线程让它做删除,或者通过一个指针称为保持确定状态为它的线程进程内使用的寿命。 看来this满足了后者,所以你应该会好到哪里去。



文章来源: Trouble referencing class in structure using this keyword