繁体   English   中英

将堆上的变量发送到另一个线程

[英]Send a variable on the heap to another thread

我在C ++中有一个奇怪的问题。 布尔的地址会被“破坏”,但不会被触及。 我知道有更好的方法来完成我尝试做的事情,但是我想知道我做错了什么。

我有一个主要班级。 这个主类包含另一个类的向量。 当创建该对象的新实例时会有一个奇怪的问题。

这是我的代码的工作方式:

当构造函数被调用“第二”对象时,将启动一个线程。 该线程作为参数获得结构体。 这是结构:

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

maby可以解释为什么会崩溃吗?

我知道我可以将指向我的类的指针发送到线程。 但是我想知道这里出了什么问题。 这样,我可以从错误中学习。

有人可以帮我解决这个问题吗?

0xFEEEFEEE表示已释放内存。 也就是说,您的AutoThreadData被删除了,并且它不在工作线程中,该线程处于无限循环中。 因此,它必须是您的主线程,也可能是析构函数,您没有显示。

无论销毁/释放KeyPressData实例的位置如何,都对此进行注释或在此处设置断点以查找发生的位置。

我想您在向量上犯了一个错误,请使用类指针而不是类本身,如下所示:

vector<class*> //instead of vector<class>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM