堆栈的定义和内存的申请与释放
堆栈
栈(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;
右侧的写法就可能造成内存泄漏,原因:有部分类成员的析构函数没有调用。
可能而不是一定的原因,如类的析构函数没有内存释放的调用,则不会诱发内存泄漏。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!