Ошибка ссылки на класс в структуре с использованием этого ключевого слова

Заголовочный файл:

// 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 а затем передать его, когда поток начинается
  • Я пытаюсь разыменовать (?) Это в рабочей функции.
  • На данный момент все компилируется нормально.
  • Когда я добавляю строки для доступа к чему-либо в классе, приложение вылетает.

Где моя ошибка?

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...
}

Что бы вы ни передавали в свою потоковую процедуру, она должна иметь действительное время жизни в течение требуемой продолжительности. по теме Либо убедитесь, что передавая владение динамическим распределением потоку при Это выполните удаление или передайте указатель известного удерживающего детерминированного состояния на весь срок его использования в thread-proc. Кажется this выполняет последнее, так что вы, вероятно, должны быть хорошими, чтобы идти.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector