随笔 - 1760  文章 - 0  评论 - 109  阅读 - 431万

8. 堆、栈与内存管理

1. 栈(stack)和堆(heap)

stack,是存在与某作用域(scope)的一块内存空间(memory space),例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。

在函数本体(function body)内声明的任何变量,其所使用的内存块都取自上述stack.

Heap, 所谓system heap, 是指由操作系统提供的一块 global 内存空间,程序可动态分配(dynamic allocated)从其中获得若干区块(blocks).

当离开作用域{}的时候,c1的生命自然就消失了, 即从栈中获得的内存,离开作用域的时候会自动释放。

当离开作用域{}的时候,动态分配的内存不会消失,即从堆中动态取得的内存不会自动消失,需要手动释放(delete 掉)。

c1所占用的空间来自stack,它就是所谓的栈对象(stack object),其声明在作用域(scope)结束之际结束。这种作用域内的对象(object),又叫做local object, auto object, 因为它会被自动清理(意思是析构函数被自动调用)

 

 

 2. 静态对象

一个对象前面加上 static 修饰符后,c2既变成所谓的静态对象(static object),其生命在作用域(scope)结束之后仍然存在,直到整个程序的结束。

如果你需要静态对象的这种特性,就要这样定义静态对象。

 3. 全局对象

定义在任何作用域或者说大括号之外的对象。

一个对象的存在和消失取决于构造函数和析构函数何时被调用。

c3就是所谓的global object,其生命在整个程序结束之后才结束,你也可以把它视为一种static object,其作用域是整个程序

 4. heap object的生命周期

 

 A:p所指向的便是heap object(堆对象),因为是动态从操作系统某个地方分配的内存,其生命周期在它被delete之际(此时默认析构函数或者手写析构函数被调用)结束。

B:会出现内存泄露(memory leak),因为当作用域结束后,p所指向的heap object仍然存在,但是指针p的生命却结束了,作用域之外再也看不到p,也就没机会delete p.

5. array new一定要搭配array delete,在使用指针新建字符数组的情况下,在手动释放内存的时候,如果delete[] p;写成了delete p;会造成内存泄露。

21h代表一个16进制的数(32);

3代表新创建了3个字符串;

 

posted on   一杯明月  阅读(301)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示