我们操作一块不存在的内存,很可能会奔溃;在有些情况下,我们很容易忽视的操作已经被释放的内存。
例:类的线程操作已经删除的类对象
class tcpTransport
{
public:
private:
staticDWORD WINAPI ThreadProcSend(LPVOID lpParam);
};
在tcpTransport线程中创建类的线程(可用于发心跳,重连)
m_hServiceThread = CreateThread(NULL, 0, ThreadProcSend, (void *)this, 0, NULL);
DWORD WINAPI tcpTransport::ThreadProcSend(LPVOID lpParam)
{
tcpTransport* pZmq = (tcpTransport *)lpParam;
while (pZmq->m_sendFlag){
}
}
pZmq是传过来的this指针,即tcpTransport对象,当这个对象释放的时候,并没有结束ThreadProcSend线程,这个线程还在用this指针,导致奔溃。
在这个对象的析构函数中加入:
if (m_sendFlag){
m_sendFlag = false; //设置条件,让线程循环终止
}
WaitForSingleObject(m_Send_HD, INFINITE); //等待类的线程退出
删除类对象之前,一定要确保它的线程安全退出,该类才能被安全删除,否则极有可能奔溃奥。