![](/img/trans.png)
[英]A thread writes a value into a variable placed in Heap memory however the variable is not updated
[英]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.