http://www.cnblogs.com/aqhistory/archive/2009/12/31/1636737.html
瞎整了半天之後,還是老老實實打開反彙編一步步看回調過程中發生了什麼,居然在回調後,所有參數入棧後,調用chkstk.asm崩潰了,我暈倒,這個問題居然,回過頭看C++代碼,找找有啥大對象在棧裏面晃悠,結果一看,居然有幾處使用的是char[64*1024]的形式,這幾處正好在一個函數調用中都遞歸了,於是光榮的越界了。於是修改那幾處緩衝到堆上,問題解決了。
下面說下我對於char[size]形式的理解,由於char[]是編譯期間分配內存的行爲,估計對於一些耗用資源不大的調用,當然首先char[]的形式,但是如果需要的內存比較大,還是取堆中取,防止棧空間不足的崩潰。
我的習慣風格:
static const int N_MAX_STACK_BUFFER = 128;
TCHAR szBuffer[128] = {0};
TCHAR * pBuffer = szBuffer;
int nSize = GetBufferSize();
if (nSize >= N_MAX_STACK_BUFFER)
{
pBuffer = new TCHAR[nSize];
}
// Action
if (nSize >= N_MAX_STACK_BUFFER)
{
delete [] pBuffer;
pBuffer = NULL;
}
至此,第二個問題解決,但是第一個問題很詫異,也沒有崩潰現象,懷疑是Debug作祟,切換到Release,把地址答應出來,OK,都正常了。這個VC的編譯器還是比較邪門的。