C++ 怎么定义二维数组 C++ 动态分配二维数组的两种写法【内存】

发布时间 - 2026-02-03 00:00:00    点击率:
推荐用new分配连续内存的二维数组:先new int[rowscols]获数据区,再new int[rows]建行指针,循环设arr[i]=data+i*cols;释放时先delete

[] data后delete[] arr;非连续方式需逐行new并遍历delete[],易泄漏。

用 new 分配连续内存的二维数组(推荐)

这种写法本质是申请一块连续内存,再用指针偏移模拟二维访问,内存局部性好、释放只需一次 delete[],适合行数列数在运行时确定但固定不变的场景。

常见错误是把 int** arr 和连续内存混用,导致越界或释放崩溃。

  • 先分配一行数据的总空间:int* data = new int[rows * cols];
  • 再分配行指针数组,每行指向对应起始位置:int** arr = new int*[rows];,然后循环赋值 arr[i] = data + i * cols;
  • 使用时仍是 arr[i][j],但底层是线性地址 data[i * cols + j]
  • 释放顺序必须是:先 delete[] data;,再 delete[] arr;(不能反过来,也不能只删一个)

用 new 分配非连续内存的二维数组(不推荐但常见)

逐行 new int[cols],每行内存可能分散在堆不同位置。容易写出,但缓存不友好、释放麻烦、易漏删某一行。

典型错误是只调用 delete[] arr; 而忘记遍历删除每行,造成严重内存泄漏。

  • 先分配行指针数组:int** arr = new int*[rows];
  • 再对每行单独分配:for (int i = 0; i
  • 释放必须严格两步:for (int i = 0; i ,然后 delete[] arr;
  • 如果某次 new int[cols] 抛异常,已有行需手动回滚释放,否则泄漏

为什么 vector> 不算“动态二维数组”的等价替代?

它确实是更安全的选择,但行为上不是二维数组——vector> 的每行是独立分配的,内存不连续,且 resize() 可能触发整行拷贝;而 C 风格二维数组强调的是“一块内存+双重下标访问”语义。

如果你需要传递给 C 接口(如 OpenGL、FFmpeg),或做高性能数值计算(如矩阵乘法),vector> 无法直接传 int**int*,必须额外拷贝或重构。

  • vector>&v[0][0] 仅在首行非空时有效,且仅保证该行连续
  • 要获得连续内存,得用单维 vector + 手动索引:v[i * cols + j]
  • 没有 int** 等价物,无法满足要求二级指针的旧 API

new 分配失败时怎么处理?

C++11 起默认 newstd::bad_alloc,不会返回 nullptr。想用 nullptr 检查,得显式加 std::nothrow

连续内存分配失败风险更高(大块内存难找),非连续方式可能某一行失败而前面已成功,状态不一致。

  • int* data = new (std::nothrow) int[rows * cols];,检查 if (!data) { /* 处理 */ }
  • 非连续方式中,若第 knew int[cols] 失败,前 k 行需立即释放,否则泄漏
  • 更稳妥的做法是封装成 RAII 类,或直接用 std::unique_ptr 管理(如 std::unique_ptr data + std::unique_ptr arr

实际项目里,除非对接 C 接口或有极致性能要求,否则优先用 std::vector<:vector>> 或单维 std::vector 加索引计算;真要用 new,第一种连续内存写法更可控,但所有手动内存管理都绕不开“分配-使用-释放”三步的精确匹配。


# ai  # c++  # 为什么  # if  # for  # 封装  # int  # 循环  # 指针  # 接口  #   # delete  # 重构  # ffmpeg  # 遍历  # 的是  # 如果你  # 已有  # 只需  # 更高  # 仍是  # 要用  # 不开  # 再用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  如何在云虚拟主机上快速搭建个人网站?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel用户密码怎么加密_Laravel Hash门面使用教程  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  Laravel如何实现API版本控制_Laravel版本化API设计方案  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  高防服务器:AI智能防御DDoS攻击与数据安全保障  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何登录建站主机?访问步骤全解析  javascript日期怎么处理_如何格式化输出  怎么用AI帮你为初创公司进行市场定位分析?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何在建站主机中优化服务器配置?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  JS经典正则表达式笔试题汇总  Laravel如何与Inertia.js和Vue/React构建现代单页应用  如何在建站宝盒中设置产品搜索功能?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  b2c电商网站制作流程,b2c水平综合的电商平台?  如何快速搭建个人网站并优化SEO?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  如何在IIS中新建站点并配置端口与物理路径?  简历在线制作网站免费版,如何创建个人简历?  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  用v-html解决Vue.js渲染中html标签不被解析的问题  ,南京靠谱的征婚网站?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何自定义错误页面(404, 500)?(代码示例)  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何使用withoutEvents方法临时禁用模型事件  如何快速查询网址的建站时间与历史轨迹?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  IOS倒计时设置UIButton标题title的抖动问题  Laravel如何处理表单验证?(Requests代码示例)  制作企业网站建设方案,怎样建设一个公司网站?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  利用vue写todolist单页应用  大型企业网站制作流程,做网站需要注册公司吗?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何在橙子建站中快速调整背景颜色?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  进行网站优化必须要坚持的四大原则