C++代碼中 棧溢出錯誤 chkstk.asm 一則

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的編譯器還是比較邪門的。


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