最近要考C++,复习过程中遇到一些问题,总结记录一下。文中代码均在ideone在线编译器中运行的。
代码
代码说明:
- 类A,含构造函数和析构函数
- 普通函数fun,函数体里新建了类A的局部自动对象
FunObj
和局部静态对象InStaObj
- main方法新建了类A的局部自动对象
MainObj
,调用fun
方法
- 外面新建了A的的外部静态对象
ExStaObj
和外部对象GblObj
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <iostream> #include <string.h> using namespace std; class A { char string[50]; public : A(char * st); ~A( ); };
A::A(char * st) { strcpy(string, st); cout << string << "被创建时调用构造函数 ! " << endl; } A::~A( ) { cout << string << "被撤消时调用析构函数 ! " << endl; }
void fun( ) { cout << "在fun( )函数体内 : \n" << endl; A FunObj("fun( )函数体内的自动对象FunObj"); static A InStaObj("内部静态对象InStaObj"); }
int main( ) { A MainObj("主函数体内的自动对象MainObj"); cout<<"主函数体内,调用fun()函数前: \n"; fun( ); cout << "\n主函数体内,调用fun()函数后:\n"; return 0; }
static A ExStaObj("外部静态对象ExStaObj"); A GblObj("外部对象GblObj");
|
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 外部静态对象ExStaObj被创建时调用构造函数 ! 外部对象GblObj被创建时调用构造函数 ! 主函数体内的自动对象MainObj被创建时调用构造函数 ! 主函数体内,调用fun()函数前: 在fun( )函数体内 :
fun( )函数体内的自动对象FunObj被创建时调用构造函数 ! 内部静态对象InStaObj被创建时调用构造函数 ! fun( )函数体内的自动对象FunObj被撤消时调用析构函数 !
主函数体内,调用fun()函数后: 主函数体内的自动对象MainObj被撤消时调用析构函数 ! 内部静态对象InStaObj被撤消时调用析构函数 ! 外部对象GblObj被撤消时调用析构函数 ! 外部静态对象ExStaObj被撤消时调用析构函数 !
|
若将A GblObj("外部对象GblObj");
写在static A ExStaObj("外部静态对象ExStaObj");
前面,则输出时两者顺序也颠倒。
分析
内存的三种分配方式
- 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储
- 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限
- 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题