内存分配和管理

malloc、calloc、realloc、alloca

  1. malloc:申请指定字节数的内存。申请到的内存中的初始值不确定。
  2. calloc:为指定长度的对象,分配能容纳其指定个数的内存。申请到的内存的每一位(bit)都初始化为 0。
  3. realloc:更改以前分配的内存长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。
  4. alloca:在栈上申请内存。程序在出栈的时候,会自动释放内存。但是需要注意的是,alloca 不具可移植性, 而且在没有传统堆栈的机器上很难实现。alloca 不宜使用在必须广泛移植的程序中。C99 中支持变长数组 (VLA),可以用来替代 alloca。

malloc、free

用于分配、释放内存

malloc、free 使用

申请内存,确认是否申请成功

  1. char *str = (char*) malloc(100);
  2. assert(str != nullptr);

释放内存后指针置空

  1. free(p);
  2. p = nullptr;

new、delete

  1. new / new[]:完成两件事,先底层调用 malloc 分了配内存,然后调用构造函数(创建对象)。
  2. delete/delete[]:也完成两件事,先调用析构函数(清理资源),然后底层调用 free 释放空间。
  3. new 在申请内存时会自动计算所需字节数,而 malloc 则需我们自己输入申请内存空间的字节数。

new、delete 使用

申请内存,确认是否申请成功

  1. int main()
  2. {
  3. T* t = new T(); // 先内存分配 ,再构造函数
  4. delete t; // 先析构函数,再内存释放
  5. return 0;
  6. }

定位 new

定位 new(placement new)允许我们向 new 传递额外的参数。

  1. new (palce_address) type
  2. new (palce_address) type (initializers)
  3. new (palce_address) type [size]
  4. new (palce_address) type [size] { braced initializer list }
  • palce_address 是个指针
  • initializers 提供一个(可能为空的)以逗号分隔的初始值列表