zoukankan      html  css  js  c++  java
  • stack around the variable “XX” was corrupted

    晚上花了几个小时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()好用

  • 相关阅读:
    liunx 用户切换 su sudo
    tomcat 虚拟目录
    如何用vue封装一个防用户删除的平铺页面的水印组件
    webpack入门学习手记(一)
    理解跨域及常用解决方案
    封装一个优雅的element ui表格组件
    使用Koa.js离不开这十个中间件
    深入理解let和var的区别
    编辑器IDE之VSCode
    WTF!! Vue数组splice方法无法正常工作
  • 原文地址:https://www.cnblogs.com/xijiyuan/p/3684043.html
Copyright © 2011-2022 走看看