C++ 学习笔记 堆、栈与内存管理

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

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

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

 

int main()
{
  complex c1(2, 1);
  complex* p = new complex(1,3);
  return o;
}

c1所占用的空间来自stack;

Complex(3)是个临时对象,其所占用的空间乃是new自heap动态分配而得,并由p指向。

指针p所占用的空间也是来自stack;

【注】内存泄漏:当指针p的生命结束时,却没有delete p指针,那么动态分配的内存没有被释放,就会出现内存泄漏(memory leak)

 

 

 

【拓展】--- new和delete的原理

array new一定要搭配 array delete

(一)new:先分配内存memory,再调用构造函数ctor

complex* p = new complex(13);

上述代码编译器转换为:

Complex *pc;

void* mem = operator new( sizeof(Complex) );        // Complex有两个double类型的值,所以分配的内存大小为8字节,其内部调用molloc(n)
pc = static_cast<Complex*>(mem);                    // 类型转换
pc->Complex::Complex(1, 2);                         // 构造函数

(二)delete:先调用析构函数dtor,再释放内存memory

String* ps = new String("Hello");
...
delete ps;

编译器转化为:

String::String(ps);         // 析构函数
operator delete(ps);        // 释放内存,其内部调用free(ps)

 

 

 

posted @ 2022-06-21 09:53  UE4_UE5_Academic  阅读(82)  评论(0)    收藏  举报