Stack,是存在于某作用域(scope) 的一块内存空间(memory space)。例如当你调用函数,函数本身即会形成一个stack 用來放置它所接收的参数,以及返回地址。在函数本体(function body) 內声明的任何变量,其所使用的內存块都取自上述stack。
Heap,也叫做system heap,是指由操作系统提供的一块global 內存空間,程序可动态分配(dynamic allocated) 从某中获得若干区塊(blocks)。
C++——堆、栈与内存管理

stack objects 的生命期

C++——堆、栈与内存管理

c1 便是所谓stack object,其生命在作用域(scope) 结束之际結束。这种作用域內的object,又称为auto object,因为它会被「自动」清理。

static local objects 的生命期

C++——堆、栈与内存管理

c2 便是所谓static object,其生命在作用域(scope)结束之后仍然存在,直到整个程序结束。

global objects 的生命期

C++——堆、栈与内存管理

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

heap objects 的生命期

C++——堆、栈与内存管理

new:先分配memory, 再調用ctor

C++——堆、栈与内存管理

C++——堆、栈与内存管理

delete:先調用dtor, 再释放memory

C++——堆、栈与内存管理

C++——堆、栈与内存管理

 

VC下内存分配

C++——堆、栈与内存管理

C++——堆、栈与内存管理

array new 一定要搭配array delete

C++——堆、栈与内存管理

delete会被拆分成2个动作,其中第二个动作会把下图那一块删掉。删掉这一块依据的是cookie,21h表明了内存大小。delete[] p; 和 delete p;都不影响这块内存的删除。这一块内存并没有发生泄漏。

C++——堆、栈与内存管理

写成delete[] p; 这样,编译器才知道这是数组,他才会知道下面不只有1个,而是3个,进而调用3次dtor。每个对象死亡之前,调用dtor,把各自分配ed内存释放掉。

写成delete p; 这样,编译器会认为下面只有1个,因此只会调用一次析构函数。结果红框部分内存泄漏

C++——堆、栈与内存管理

如果使用复数的例子,根本没有指针,也不涉及动态分配。使用array new,而么有array delete也OK。因为他没要红框中的东西

C++——堆、栈与内存管理

但是我们不因该因此而掉以轻心,array new与array delete搭配是个好的编程习惯。

 

 

 

 

 








 

相关文章:

  • 2022-01-01
  • 2021-09-27
  • 2021-08-09
  • 2021-07-24
  • 2022-12-23
  • 2022-01-14
猜你喜欢
  • 2022-12-23
  • 2022-01-21
  • 2021-12-22
  • 2021-09-16
  • 2022-02-16
相关资源
相似解决方案