C系列堆栈的区别

2452阅读 0评论2011-10-29 blacksapper
分类:C/C++

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()来释放的。
栈上面有没有用下次看看是咋回事。
 
 
 
 
 
 
上一篇:计算最大的连续K的整数的和
下一篇:用一把密码保存所有的密码