Отправить переменную в куче в другой поток - PullRequest
0 голосов
/ 31 марта 2012

У меня странная проблема в 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

Может кто-нибудь объяснить, почему произошел этот сбой?

Я знаю, что могу отправитьуказатель на мой класс в теме.Но я хочу знать, что здесь не так.Таким образом, я могу учиться на своих ошибках.

Может ли кто-нибудь помочь мне с этой проблемой?

Ответы [ 2 ]

0 голосов
/ 31 марта 2012

Полагаю, что вы допустили ошибку с вектором, используйте указатель класса вместо самого класса, например:

vector<class*> //instead of vector<class>
0 голосов
/ 31 марта 2012

0xFEEEFEEE указывает на освобождение памяти.То есть вы AutoThreadData были удалены, и это не было в вашем рабочем потоке, который находится в бесконечном цикле.Итак, это должен быть ваш основной поток и, возможно, деструктор, которого вы не показывали.

Где бы вы ни уничтожили / освободили свой экземпляр KeyPressData, закомментируйте это или установите точку останова, чтобы узнать, где он находится.происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...