Run-Time Check Failure #3 - The variable 'comstat' is being used without being initialized

方案1: 改變項目配置屬性


一種解決方案是改變基本運行時檢查(changing the runtime checks in project settings):在菜單Project->Project properties-> C/C++ -> Code generation-> Basic Runtime checks --> change to 'Default',在中文版中是:項目-〉屬性-〉配置屬性-〉C/C++代碼生成-〉基本運行時檢查-〉設置爲默認,當將基本運行時檢查改爲默認之後,編譯自然順利通過了,向串口調試助手發送消息正常了,再從串口調試助手向SerialPortTest發送消息時,也正常了。


方案2:改變comstat變量屬性


另一種解決方案是將CSerialPort.CPP中的COMSTAT comstat;改爲static COMSTAT comstat;這樣改了之後,debug順利通過,然後調試,與串口調試助手相互發消息都OK了。爲什麼這樣就能解決呢?其實當你使用debug解決方案時,它的基本運行時檢查初始設置爲:兩者(/RTC1,等同於 /RTCsu),這個兩者是指:堆棧幀(/RTCs),未初始化的變量(/RTCu)。由於它要檢查未初始化的變量,所以將SerialPort.cpp中的COMSTAT comstat;改爲static COMSTAT comstat;就可以正常使用CSerialPort類了。
以上是在debug下的解決方案,當在Release編譯狀態時,你會發現並不需要將COMSTAT comstat;改爲static COMSTAT comstat;就能編譯成功並且發送接收消息正常。其實,在Release下,它的基本運行時檢查初始設置已爲默認。這應該也算是第一種解決方案之內。
而當你將它設置爲兩者(/RTC1,等同於 /RTCsu)時,不論是否將COMSTAT comstat;改爲static COMSTAT comstat;,編譯都不能通過,報錯““cl.exe”返回的結果有誤。",這個應該是屬於Release的問題了,另當別論了。

方案3:

添加代碼:memset(&comstat, 0, sizeof(COMSTAT)); //VC6不用這句也可以用,2008就要加.

**************************************************************以上是拿到VS2010中編譯出現的問題**********************************

在後續又發現了這樣一個問題:如下

對於該類中提供的StopMonitoring函數只能掛起線程,沒辦法結束線程,而當用戶打開端口後需要關閉端口,或者結束程序,那麼就會導致線程無法結束,窗口銷燬後進程駐留在內存中,一直停在該類的析構函數處,如下:

CSerialPort::~CSerialPort()
{
do
{
SetEvent(m_hShutdownEvent);
} while (m_bThreadAlive);
TRACE("Thread ended\n");
delete [] m_szWriteBuffer;
}

解決方法是:設置m_hShutdownEvent爲有信號狀態,然後線程中的WaitForMultipleObjects()函數將會捕獲到信號,返回事件編號,執行線程內部的AfxEndThread(100);來結束線程,並將m_bThreadAlive賦值爲FALSE,以讓CSerialPort類析構,從而真正結束程序並釋放資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章