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

堆栈

栈(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;

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

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

posted @   手磨咖啡  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示