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 起默认 new 抛 std::bad_alloc,不会返回 nullptr。想用 nullptr 检查,得显式加 std::nothrow。
连续内存分配失败风险更高(大块内存难找),非连续方式可能某一行失败而前面已成功,状态不一致。
- 用
int* data = new (std::nothrow) int[rows * cols];,检查 if (!data) { /* 处理 */ }
- 非连续方式中,若第
k 行 new int[cols] 失败,前 k 行需立即释放,否则泄漏
- 更稳妥的做法是封装成 RAII 类,或直接用
std::unique_ptr 管理(如 std::unique_ptr data + std::unique_ptr arr )
实际项目里,除非对接 C 接口或有极致性能要求,否则优先用 std::vector<:vector>> 或单维 std::vector 加索引计算;真要用 new,第一种连续内存写法更可控,但所有手动内存管理都绕不开“分配-使用-释放”三步的精确匹配。
它确实是更安全的选择,但行为上不是二维数组——vector 的每行是独立分配的,内存不连续,且 resize() 可能触发整行拷贝;而 C 风格二维数组强调的是“一块内存+双重下标访问”语义。
如果你需要传递给 C 接口(如 OpenGL、FFmpeg),或做高性能数值计算(如矩阵乘法),vector 无法直接传 int** 或 int*,必须额外拷贝或重构。
-
vector的> &v[0][0]仅在首行非空时有效,且仅保证该行连续 - 要获得连续内存,得用单维
vector+ 手动索引:v[i * cols + j] - 没有
int**等价物,无法满足要求二级指针的旧 API
new 分配失败时怎么处理?
C++11 起默认 new 抛 std::bad_alloc,不会返回 nullptr。想用 nullptr 检查,得显式加 std::nothrow。
连续内存分配失败风险更高(大块内存难找),非连续方式可能某一行失败而前面已成功,状态不一致。
- 用
int* data = new (std::nothrow) int[rows * cols];,检查if (!data) { /* 处理 */ } - 非连续方式中,若第
k行new 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 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel如何使用Collections进行数据处理?(实用方法示例)
免费视频制作网站,更新又快又好的免费电影网站?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Java垃圾回收器的方法和原理总结
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
JS弹性运动实现方法分析
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
历史网站制作软件,华为如何找回被删除的网站?
如何快速上传自定义模板至建站之星?
如何在七牛云存储上搭建网站并设置自定义域名?
C++时间戳转换成日期时间的步骤和示例代码
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
如何用AI帮你把自己的生活经历写成一个有趣的故事?
如何用y主机助手快速搭建网站?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
如何安全更换建站之星模板并保留数据?
linux写shell需要注意的问题(必看)
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Python并发异常传播_错误处理解析【教程】
油猴 教程,油猴搜脚本为什么会网页无法显示?
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
如何在腾讯云服务器上快速搭建个人网站?
Laravel如何自定义错误页面(404, 500)?(代码示例)
iOS发送验证码倒计时应用
如何在企业微信快速生成手机电脑官网?
如何在景安服务器上快速搭建个人网站?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
如何在Windows环境下新建FTP站点并设置权限?
QQ浏览器网页版登录入口 个人中心在线进入
微信小程序 scroll-view组件实现列表页实例代码
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
详解jQuery中基本的动画方法
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】


