0

0

c++如何动态分配二维数组_c++ new二维数组写法【技巧】

冰火之心

冰火之心

发布时间:2026-01-24 16:32:02

|

213人浏览过

|

来源于php中文网

原创

推荐用new分配连续内存的二维数组:先new int[rowscols]申请一维空间,再new int[rows]创建行指针数组,使matrix[i]指向data+i*cols,支持matrixi访问,delete[] data一次释放全部。

c++如何动态分配二维数组_c++ new二维数组写法【技巧】

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

多数人写 new int*[rows] 再循环 new int[cols],看似二维,实则指针数组 + 多段堆内存,容易漏删、缓存不友好。真正高效且易管理的方式是分配一块连续内存,再用指针偏移模拟二维访问。

  • int data = new int[rows cols] 申请一维连续空间
  • 定义行指针数组: int* matrix = new int[rows]
  • 每行指向对应起始位置:matrix[i] = data + i * cols
  • 使用时仍可写 matrix[i][j],但底层是线性寻址,delete[] data 一次释放全部

注意:不能直接 delete[] matrix 后再 delete[] data —— matrix 是指针数组,必须先 delete[] matrix,再 delete[] data;顺序反了会出错。

std::vector<:vector>> 看似方便,但有坑

它语法简洁,支持 vec[i][j],但每个内层 vector 是独立分配的,内存不连续,遍历时 cache miss 高;插入/扩容还可能触发多次重分配。

  • 如果只做小规模、读写不频繁的配置表或临时结构,可用
  • 若涉及数值计算、图像处理、矩阵运算等性能敏感场景,别用它
  • 替代方案:用单个 std::vector 存数据,自己算索引:vec[i * cols + j],再封装一个轻量 wrapper 类控制访问

释放时必须匹配分配方式,否则未定义行为

C++ 不允许混用分配与释放方式,这是常见崩溃源头:

蕉点AI
蕉点AI

AI电商商品图生成平台 | 智能商品素材制作工具

下载

立即学习C++免费学习笔记(深入)”;

  • new[] 必须配 delete[],不能用 delete
  • 如果用 new int*[rows] + 循环 new int[cols],释放必须两层:for (int i = 0; i
  • 漏掉任一层,或把 delete[] matrix[i] 写成 delete matrix[i],都会导致内存泄漏或 heap corruption
  • 建议:只要没用 std::unique_ptr 或 RAII 封装,就在分配后立刻写下对应的释放代码,避免后续遗忘

现代 C++ 更推荐用 std::unique_ptr 管理

手动 new/delete 容易出错,尤其异常路径下。用智能指针可自动释放:

  • 连续内存版:auto data = std::make_unique(rows cols); auto matrix = std::make_unique[]>(rows); for (int i = 0; i
  • 此时无需显式 delete,离开作用域自动清理
  • 注意:std::make_unique(rows) 分配的是指针数组,不是二维数组本身,仍需手动初始化各行指向

真正的难点不在怎么写,而在是否意识到「二维」只是逻辑视角——物理内存是否连续、谁负责释放、异常是否安全,这些细节一旦忽略,调试时很难定位。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

381

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

274

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.12.29

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 50.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号