ToB企服应用市场:ToB评测及商务社交产业平台

标题: C++ 指针进阶:动态分配内存 [打印本页]

作者: 吴旭华    时间: 2024-1-8 21:09
标题: C++ 指针进阶:动态分配内存
C++ 动态实例化(new 和 malloc)

malloc / free

工作原理

malloc 是 stdlib.h 库中的函数,声明为 void *__cdecl malloc(size_t _Size);
free 也是 stdlib.h 库中的函数,声明为 void __cdecl free(void *_Memory);
具体使用

动态创建一维数组
  1. size_t element_cnt = 10;
  2. int *arr = (int *)malloc(element_cnt * sizeof(int));
  3. free(arr)
复制代码
动态创建二维数组
  1. size_t m = 10, n = 10;
  2. int **arr = (int **)malloc(m * sizeof(int *));
  3. for (int i = 0; i < m; i ++)
  4.     arr[i] = (int *)malloc(n * sizeof(int));
复制代码
需要注意,这样获得的二维数组,不能保证其空间是连续的。
calloc

calloc 定义在 stdlib.h 库中,声明为 void *__cdecl calloc(size_t _NumOfElements,size_t _SizeOfElements);
calloc 与 malloc 的主要区别有:
realloc

realloc 定义在 stdlib.h 库中,声明为 void *__cdecl realloc(void *_Memory,size_t _NewSize);,用于对动态内容进行扩容
new / delete

工作原理

new 和 delete 是 C++ 中的关键字,若要使用,需要编译器支持。
具体应用

动态实例化
  1. // 动态创建变量
  2. int *p = new int(1234);
  3. /* ... */
  4. delete p;
复制代码
new 动态创建对象时会经历三个步骤:
delete 释放对象内存时会经历两个步骤:
  1. // 开辟新的对象
  2. class A {
  3.     int a;
  4. public:
  5.     A(int a_) : a(a_) {}
  6. };
  7. int main() {
  8.     A *p = new A(1234);
  9.     /* ... */
  10.     delete p;
  11. }
复制代码
{} 运算符可以用来初始化没有构造函数的结构。初次以外,使用 {} 运算符可以使得变量的初始化形式变得同意。
  1. struct ThreeInt {
  2.   int a;
  3.   int b;
  4.   int c;
  5. };
  6. int main() {
  7.   ThreeInt* p = new ThreeInt{1, 2, 3};
  8.   /* ... */
  9.   delete p;
  10. }
复制代码
动态创建数组

创建和释放数组需要使用 new[] 和 delete[],new[] 运算符会返回数组的首地址。
  1. size_t element_cnt = 5;
  2. int *p = new int[element_cnt];
  3. /* ... */
  4. delete[] p;
复制代码
动态创建二维数组

动态创建二维数组有以下三种方式:
malloc 和 new 的主要区别

特征new / deletemalloc / free分配内存的位置自由存储区堆内存分配失败抛出异常 bac_alloc返回 NULL分配内存大小编译器根据类型计算得出显式指定字节数处理数组new[]人为计算数组大小后进行内存分配已分配内存的扩张不支持realloc分配时内存不足可以指定处理函数或重新指定分配器无法通过用户代码处理是否可以重载可以不可以构造和析构函数调用不调用
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4