c++创建对象(四种方法)和内存分析

四种对象定义方式(in stack、in heap、in global area)

https://mintlucas.github.io/2019/02/26/C-简洁的链表创建/

在C++中,编译器把内存分为三个部分,有四种方法可以产生一个对象。

  • 静态存储区域:主要保存全局变量和静态变量。生存期:整个程序。

  • 堆:存储动态生成的变量。生存期:自己来决定。

  • 栈:存储调用函数相关的变量和地址等。生存期:所处的语句块(既{}的范围)

  1. 第一种方法是在堆栈(stack)之中产生:
  • 这时在栈中已经为它分配了一个空间存放所有的成员变量,调用这个对象的成员变量和成员函数时用“.”操作符。如:myclass.value,myclass.function()。
  • 对于局部对象,使用完后不需要手动释放,该类析构函数会自动执行。
void MyFunc()

{

       3dPoint p = 3dPoint(1,2,3);    // 显式调用,栈中分配
       3dPoint p(1,2,3);//隐式调用

       ...

}

2.第二种方法是在堆(heap)中产生:

  • 对于以new方式产生出来的局部对象,只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。
  • new的好处,一处初始化,多处使用
  • 频繁调用场合并不适合new,就像new申请和释放内存一样
  • 因为是指针的操作,所以调用这个对象的成员变量和函数时要用“->”例如myclass.value ,myclss->function()
  • 指针访问前,必须指向一段有效的内存,不管是堆的还是栈的,p = &a即指向了栈内存。
void MyFunc()

{

       CFoo* foo = new CFoo;
    // 在堆(heap)中产生对象,动态需指针
    //不加括号调用默认构造函数(无参)或唯一的构造函数
    //若有中括号需要有一个正整数参数,申请到的内存指向数组,delete时需要delete []foo;

       CTest* pTest = NULL;
       //类指针可以先行定义,但类指针只是个通用指针,在new之前并为该类对象分配任何内存空间
       pTest = new CTest();
       ...

}

3.第三种方法是产生一个全局对象

  • 对于全局对象,加extern可在其他文件中访问,在main()之前分配内存。
CFoo foo;    // 在任何函数之外作此操作

4.第四种方法是产生一个静态局部对象

  • 静态局部变量与全局变量共享全局数据区,只生效一次,可以使用它确定某函数是否被调用过,private虽然在函数调用后还存在与全局区,但仅在定义它的函数中可见,且编译时自动初始化(0orNULL),动态运行时随机值。
void MyFunc()

{

       static CFoo foo;    // 在函数范围之内的一个静态对象

       ...

}

一般的全局对象在程序的其他文件中可以通过关键字extern来调用,而static声明的全局变量则只能在本文件中使用。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值