堆栈的定义和内存的申请与释放

堆栈

栈(stack):存在于某个作用域的一块内存空间。

堆(heap):由操作系统提供的一块global内存空间,程序可动态获取若干块。

{
    Complex c1(1, 1);
    Complex *c2 = new Complex(1, 1);
}

c1内存空间在栈上,c2内存空间在堆上。

new:

Complex *p = new Complex(1,1);                  //编译器转换new为3个步骤:
(1). void *vp = operate new (sizeof(Complex));  //分配内存
(2). Complex *p = static_cast(Complex*)vp;      //转型
(3). p->Complex::Complex(1,1);                  //构造函数

delete:

     delete p;                //编译器会转换为2个步骤:
(1). p->Complex::~Complex();  //对象的析构函数
(2). operate delete(p);       //释放p指向的内存

数据在动态分配内存中的占用方式:

debug版本的对象在内存中的调试字节占用36bytes

每个对象占用的内存空间16bytes对齐

上下各一个字节都存放该对象的大小和写入信息。

new [], delete [] 搭配使用 

String* p = new String[3];               String* p = new String[3];    

 delete [] p;                                      delete p;

右侧的写法就可能造成内存泄漏,原因:有部分类成员的析构函数没有调用。

可能而不是一定的原因,如类的析构函数没有内存释放的调用,则不会诱发内存泄漏。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值