首页 新闻 会员 周边

C++生存期问题

0
悬赏园豆:30 [已解决问题] 解决于 2013-06-30 16:22
 1 #include<iostream>
 2 #include<windows.h>
 3 using namespace std;
 4 class T
 5 {
 6 protected:
 7     int t;
 8 public:
 9     T(int r=0):t(r){}
10     void showNum(){cout<<t<<endl;}
11 };
12 class T1:public T
13 {
14 private:
15     int x;
16 public:
17     T1(int r):x(r),T(r){}
18     void show(){cout<<"x="<<x<<endl;}
19 };
20 class T2:public T
21 {
22 private:
23     int x;
24 public:
25     T2(int r):x(r*r),T(r){}
26     void show(){cout<<"x="<<x<<endl;}
27 };
28 void main()
29 {
30     T* p[5];
31     for(int i=0;i<5;i++)
32     {
33         if(i%2==0)
34         {T1 r(2);p[i]=&r;cout<<&r<<endl;}
35         else
36         {T2 r(3);p[i]=&r;cout<<&r<<endl;}
37     }
38     for(int i=5;i<10;i++)
39     {
40         if(i%2==0)
41         {T1 r(4);p[i]=&r;cout<<&r<<endl;}
42         else
43         {T2 r(5);p[i]=&r;cout<<&r<<endl;}
44     }
45     for(int i=0;i<10;i++)
46     {
47         p[i]->showNum();
48     }
49     system("pause");
50 }

首先为什么输出的地址是这样的,而不是相同的地址(前5个是一组,后5个是一组)

还有后5个地址为什么和前5个地址也不一样?

 

如果有人能从栈详细解释下就感激不尽不尽了~~

C++
wkl7123的主页 wkl7123 | 初学一级 | 园豆:154
提问于:2013-06-12 16:36
< >
分享
最佳答案
0

这个程序运行报错,

 T* p[5]; 改为  T* p[10]; 就可以了。

另外,关于

(1) C++变量生命周期

(2) C++变量在栈中分配方式

(3) C++类的内存布局

我打算写博客来分析,近几天会写,我们可以在博客里交流。

http://www.cnblogs.com/yylwuwei/p/3146306.html

收获园豆:30
yylwuwei | 菜鸟二级 |园豆:232 | 2013-06-20 17:01
其他回答(1)
0

估计和编译器有关,应该是没有规定这些栈对象该如何分配的,一般也无需关注栈对象如何分配,只需要注意不要同时分配过多大对象导致栈溢出即可。

天方 | 园豆:5407 (大侠五级) | 2013-06-12 21:19

对,我想稍稍了解下这些变量在栈中的分配方式

支持(0) 反对(0) wkl7123 | 园豆:154 (初学一级) | 2013-06-12 22:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册