Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38253
  • 博文数量: 7
  • 博客积分: 171
  • 博客等级: 入伍新兵
  • 技术积分: 85
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-04 22:13
文章分类

全部博文(7)

文章存档

2012年(3)

2011年(4)

我的朋友

分类:

2011-12-04 11:04:37

原文地址:C系列堆栈的区别 作者:blacksapper

main.cpp
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include "A.h"
  4. #include "B.h"

  5. int main(int argc, char *argv[])
  6. {
  7.      
  8.     A a;
  9.     A *ptr=new A();
  10.     a.f();//栈上面 在作用周期内是 没有办法被释放的 ,它将随着系统上下文的完成被系统自动回收
  11.     ptr->f();//堆上面。可以被调用回收
  12.     delete ptr;
  13.     a.~A();//按照上面的理论这个只是表面被回收了,实际没有被回收 
  14.     
  15.     for(int i=0;i<=5;i++)
  16.        A *b=new A(); //在堆上可惜没法使用
  17.     
  18.     for(int i=0;i<=5;i++)
  19.        A c; //在栈上随着生命周期被释放
  20.      
  21.      B b1;
  22.     system("PAUSE");
  23.     return 0;
  24. }
B.h
  1. #ifndef B_h
  2. #define B_h



  3. class B:A{
  4. public :
  5.        B();
  6.        ~B();
  7.        void f();
  8. };
  9. #endif
B.cpp
  1. #include "A.h"
  2. #include "B.h"
  3. #include <iostream>
  4. using namespace std;
  5. B::B(){
  6.        cout<<"类B被创建了"<<endl;
  7. }
  8. B::~B(){
  9.         cout<<"B OVER 了"<<endl;
  10. }
  11. void B::f(){
  12.        cout<<"this is F"<<endl;
  13. }
A.h
  1. #ifndef A_h
  2. #define A_h



  3. class A{
  4. public :
  5.        A();
  6.        ~A();
  7.        void f();
  8. };
  9. #endif
A.cpp
  1. #include "A.h"
  2. #include <iostream>
  3. using namespace std;
  4. A::A(){
  5.        cout<<"类A被创建了"<<endl;
  6. }
  7. A::~A(){
  8.         cout<<"A OVER 了"<<endl;
  9. }
  10. void A::f(){
  11.        cout<<"this is F"<<endl;
  12. }
注意堆栈
 第一个A a
在栈上面被创建。随着main函数的消失而消失。除此之外没法消失。要是不信可以用WINDOWS下的CMD运行生成后的可执行文件。
第二个生成的指针指向的在堆上面。
后面两个for生成的都没法用。一个在堆上面。一个随着for作用域的结束而结束。
C语言数据内容大都在内存里面,极少部分在寄存器里面。
内存分为堆,栈,常量和全局区里面
其中在栈上面的不能想结束就结束。这个回答了http://blog.chinaunix.net/space.php?uid=25887681&do=blog&id=369955的部分问题。看来不是system.gc()来释放的。
栈上面有没有用下次看看是咋回事。
 
 
 
 
 
 
阅读(969) | 评论(0) | 转发(0) |
0

上一篇:学习笔记-汇编

下一篇:我的conky备份

给主人留下些什么吧!~~