ITPub博客

首页 > > > 循环体内的局部变量内存分配和释放

循环体内的局部变量内存分配和释放

作者:古月雪 时间:2019-11-06 13:43:45 0 删除 编辑

最近查找bug时碰到了循环体中局部变量的内存分配相关的问题,于是查找相关知识,产生了一点疑问。先写代码:

1int main() 2{ 3int i; 4boolbl =true; 5for(i=0; i<3; i++) 6 { 7intnvar[10]; 8if(bl) 9 {10printf("uninitial ");11bl =false;12 }13else{14printf("before:%d ",nvar[0]);15 }16nvar[0] =10*i;17//nvar[i] = 10*i;18printf("after:%d\n",nvar[0]);19 }20}

实际上,我主要是想看看几个问题:

1、循环体每次循环是否都会为整形数组分配内存

2、每次进入循环时,nvar[0]的值是不是都保留了上一个循环时的值

发现:

1、由于编译器的优化,不会每次循环都会为数组分配内存,而是进入for循环之前一次分配好。

2、每次进入循环时,nvar[0]的值虽然保留了上一个循环的值,但是打印这个值是会报错的,编译器提示变量undefined,因为实际上这个地址对应的变量是一个新的变量,上一个循环产生的变量已经在循环结束时析构。其实把这个数组换成一个类的对象,会更好理解,如下:

1class B 2{ 3private: 4int b; 5public: 6 B() 7 { 8printf("construction function\n"); 9 }10B(B &b)11 {12printf("copy construction function\n");13 }14~B()15 {16printf("destruction function\n");17 }18};1920int main()21{22 B class1;23for(inti=0; i<3; i++)24 {25 B bclass1;26for(i=0; i<3; i++)27 {28B bclass2 = bclass1;29 }30}

结果:

在回到上面的那个问题,当我把循环体中数据的复制方式换成nvar[i] = 10*i时,就不会产生运行错误。这是为什么?难道这样赋值时,上一次循环的临时对象不会析构吗?

c++

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3711/viewspace-3120569/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 关于C语言的题目
请登录后发表评论 登录
全部评论

注册时间:2019-07-09

  • 博文量
    160
  • 访问量
    1174