使用此关键字在结构中引用类时出现问题
Trouble referencing class in structure using this keyword
>头文件:
// 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
满足后者,所以你应该很高兴。
相关文章:
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Xcode 语义问题引用或以前定义的代码
- C++ 关于指针取消引用的技术问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- 棘手的按值传递和按引用递归问题传递
- 当我尝试通过 arduino 上的引用传递布尔数组时出现问题
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 取消引用向量时出现问题
- 有关从C++中的不同源文件引用类的问题
- C++:取消引用十六进制值,有点语法问题
- 运行veins_inet示例 - 未定义的引用的 Omnet++ 问题
- C++ - 对 PCM::getInstance() 的未定义引用问题
- 通过键入的引用问题传递函数
- 一个关于继承和引用的C++问题
- 关于引用数组位置的问题
- printf(时差程序)中的引用问题
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- "Field has incomplete type"引用自己的类的问题
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 使用 opencv 和 C++ - 未定义的引用的链接器出现问题