四种对象定义方式(in stack、in heap、in global area)
在C++中,编译器把内存分为三个部分,有四种方法可以产生一个对象。
静态存储区域:主要保存全局变量和静态变量。生存期:整个程序。
堆:存储动态生成的变量。生存期:自己来决定。
栈:存储调用函数相关的变量和地址等。生存期:所处的语句块(既{}的范围)
- 第一种方法是在堆栈(stack)之中产生:
- 这时在栈中已经为它分配了一个空间存放所有的成员变量,调用这个对象的成员变量和成员函数时用“.”操作符。如:myclass.value,myclass.function()。
- 对于局部对象,使用完后不需要手动释放,该类析构函数会自动执行。
1 | void MyFunc() |
2.第二种方法是在堆(heap)中产生:
- 对于以new方式产生出来的局部对象,只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。
- new的好处,一处初始化,多处使用
- 频繁调用场合并不适合new,就像new申请和释放内存一样
- 因为是指针的操作,所以调用这个对象的成员变量和函数时要用“->”例如myclass.value ,myclss->function()
- 指针访问前,必须指向一段有效的内存,不管是堆的还是栈的,p = &a即指向了栈内存。
1 | void MyFunc() |
3.第三种方法是产生一个全局对象
- 对于全局对象,加extern可在其他文件中访问,在main()之前分配内存。
1
CFoo foo; // 在任何函数之外作此操作
4.第四种方法是产生一个静态局部对象
- 静态局部变量与全局变量共享全局数据区,只生效一次,可以使用它确定某函数是否被调用过,private虽然在函数调用后还存在与全局区,但仅在定义它的函数中可见,且编译时自动初始化(0orNULL),动态运行时随机值。
1 | void MyFunc() |
一般的全局对象在程序的其他文件中可以通过关键字extern来调用,而static声明的全局变量则只能在本文件中使用。