You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++递归分配内存是什么?这段二维动态数组分配代码的作用是什么?

在C++中理解递归分配内存及示例代码解析

首先来说说你问的递归分配内存——其实更准确的说法是分层动态内存分配,不过大家有时候会叫它“递归式”分配,核心逻辑就是一层套一层地在堆上分配内存:先申请一块用来存指针的空间,再给每个指针单独申请另一块数据空间,就像递归调用那样,一层接一层地深入构建多层内存结构。这种方式最常用的场景就是创建动态二维(或更高维)数组,毕竟C++没有原生的动态多维数组语法,只能靠这种分层方式模拟。

接下来咱们拆解你给出的这段代码,一步一步看它到底干了啥:

double** ptr_d = new double*[2]; 
ptr_d[0] = new double[50]; 
ptr_d[1] = new double[50];

第一步:分配指针数组

第一行double** ptr_d = new double*[2];做了两件事:

  • 它在堆内存里申请了一块连续的空间,这块空间刚好能放下2个double*类型的指针(也就是指向double的指针)。
  • 然后把这块空间的起始地址赋值给ptr_d——ptr_d是个二级指针,现在它就成了这个指针数组的“头”,可以通过ptr_d[0]、ptr_d[1]访问数组里的两个指针元素。

第二步:给第一个指针分配数据空间

第二行ptr_d[0] = new double[50];:

  • 这次是在堆上申请了一块能装50个double类型数值的连续空间。
  • 把这块空间的起始地址赋值给指针数组里的第一个元素ptr_d[0],现在ptr_d[0]就指向了这50个double的起始位置,你可以用ptr_d[0][0]、ptr_d[0][1]...来访问这些数值。

第三步:给第二个指针分配数据空间

第三行ptr_d[1] = new double[50];和第二行逻辑完全一样:

  • 再申请一块50个double的堆空间,把地址赋值给ptr_d[1],这样ptr_d[1]也指向了自己的那50个double元素。

额外提醒

这段代码跑完后,你就得到了一个模拟的二维动态数组:它有2行,每行50个double元素。不过要注意,这两行的内存块是独立分配的,它们在堆里不一定是连续的(和静态二维数组double arr[2][50]不一样)。另外,C++不会自动释放堆内存,所以用完之后一定要手动清理,不然会造成内存泄漏,清理顺序要反过来:先释放每行的数组,再释放指针数组:

delete[] ptr_d[0];
delete[] ptr_d[1];
delete[] ptr_d;

内容的提问来源于stack exchange,提问作者zenarthra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:25:33