晚上花了几个小时fix了这个恼人的BUG!“在变量XX周围的堆栈已损坏”
在网上找到的解释是:
把“project->配置属性->c/c++->代码生成->基本运行时检查 设置为默认值,就没有这样的错误了。关于MSDN的解释是在堆栈外面读写某数据。错误是名为RTC1的编译器检测的。又看了更多的技术文章,发现这样的错误是程序员在项目到了一定大的时候,它占用的堆栈量就比较大。我也深有体会。因为自己本来编写一个类,运行时没有错,但是在添加成员属性的时候,在其它方式不变的情况下就容易发生这样的错误。所以据此我猜应该是VS在内部就限定了堆栈的大小,当项目足够大的时候,就会溢出。
1 char *transformation(char *str) //在字符串插入字符的个数,如"aaabb" 转换后为 aaa3bb2 2 { 3 if (NULL == str) 4 { 5 return NULL; 6 } 7 char *temp =str; 8 int len =strlen(str); 9 int count = 1; 10 char* buf = new char[len+1]; 11 char* pos =str; 12 char* pos1 = str+1; 13 while (*str) 14 { 15 if (*pos++ == *pos1++) 16 { 17 count++; 18 } 19 else 20 { 21 int2str(count,buf); //本来开始准备用_itoa_s发现不好用,自己写了一个整形转字符串函数 22 int nbit = strlen(buf); 23 strcat_s(buf,len+1,pos); 24 *pos=0; 25 strcat_s(str,2*len,buf); 26 pos +=nbit; 27 pos1+=nbit; 28 str = pos; 29 count =1; 30 } 31 } 32 delete []buf; 33 return temp; 34 35 }
我在函数栈内申请了一个buf的字符数组,最开始我设置数组长度为200出现了BUG,设置为len+1后没报BUG,可能就是因为堆栈占用过多。
还有想吐槽一下 C++里的 strcat_s(),_itoa_s()函数用起来很不爽,还要指定长度,虽然这样可以防止溢出,但是我觉得用起来不爽,为什么_strcat_s()不在函数里面调用strlen()检查,还要程序员自己指定,不如C里面的strcat()好用