瞎整了半天之后,还是老老实实打开反汇编一步步看回调过程中发生了什么,居然在回调后,所有参数入栈后,调用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的编译器还是比较邪门的。

  另外,发现自己行文中闲扯真多。不是好习惯。