У меня странная проблема в C ++.Адрес логического объекта «уничтожается», но не затрагивается.Я знаю, что есть лучшие способы выполнить то, что я пытаюсь сделать, но я хочу знать, что я делаю неправильно.
У меня есть основной класс;этот основной класс содержит вектор другого класса.При создании нового экземпляра этого объекта возникает странная проблема.
Вот как работает мой код:
Там будет запущен поток, когда конструктор будет вызван из "2nd" объекта.Этот поток получает в качестве параметра структуру.Это структура:
struct KeyPressData
{
vector<bool> *AutoPressStatus;
vector<int> *AutoPressTime;
bool * Destroy;
bool * Ready;
};
Структура заполняется в конструкторе:
MultiBoxClient::MultiBoxClient()
{
//init data
DestroyThread = new bool;
ReadyThread = new bool;
AutoThreadData = new KeyPressData;
//Reseting data
*DestroyThread = false;
*ReadyThread = false;
//KeyPressData configurating
AutoThreadData->AutoPressStatus = &AutoPressStatus;
AutoThreadData->AutoPressTime = &AutoPressTime;
AutoThreadData->Destroy = DestroyThread;
AutoThreadData->Ready = ReadyThread;
//Start the keypress thread
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)AutoKeyThread,AutoThreadData,NULL,NULL);
}
Это определение MultiBoxClient:
class MultiBoxClient
{
private:
HWND ClientHandle;
vector<bool> KeyPresses;
vector<bool> AutoPressStatus;
vector<int> AutoPressTime;
KeyPressData * AutoThreadData;
bool * DestroyThread;
bool * ReadyThread;
public:
MultiBoxClient();
MultiBoxClient(HWND Handle);
~MultiBoxClient();
void EditClient(HWND Handle);
void SendKeypress(vector<bool> KeyStatus);
void SendKeyCombination(unsigned int id);
void AutoCast(int Key,unsigned int Time,bool status);
bool IsAlive();
};
MultiBoxClient создантаким образом:
int main()
{
MultiboxControler * MainControler = new MultiboxControler;
while(true)
{
Sleep(1000);
}
delete MainControler;
return false;
}
Пока программа работает, программа будет работать нормально.Но когда конструктор закрывается, адрес AutoThreadData->Destroy
будет поврежден.Программа вылетает, когда я вызываю значение указателя.
void WINAPI AutoKeyThread(void * ThreadData)
{
KeyPressData * AutoThreadData = (KeyPressData*)ThreadData;
while(true)
{
if(*AutoThreadData->Destroy == true) //CRASH
{
*AutoThreadData->Ready = true;
return;
}
Sleep(100);
}
}
Что я тестировал:
Я зарегистрировал адрес AutoThreadData и AutoThreadData->Destroy
когда строитель работает и закрыт;адрес AutoThreadData
равен AutoThreadData
, когда конструктор закрыт.Так что здесь нет проблем.
Адрес AutoThreadData->Destroy
уничтожается при закрытии конструктора.Но как это может произойти?Логическое значение находится в куче, а структура KeyPressData
(AutoThreadData) - в куче.
Destroy before: 00A85328
Destroy after: FEEEFEEE
Может кто-нибудь объяснить, почему произошел этот сбой?
Я знаю, что могу отправитьуказатель на мой класс в теме.Но я хочу знать, что здесь не так.Таким образом, я могу учиться на своих ошибках.
Может ли кто-нибудь помочь мне с этой проблемой?