静态数组大小必须编译期确定,如int arr[5];动态数组需new[]/delete[]手动管理,易出错;推荐用std::array(静态)和std::vector(动态),必要时用std::unique_ptr接管堆数组。

静态数组定义:类型+大小必须在编译期确定
静态数组的大小写死在代码里,比如 int arr[5],编译器看到就分配 5 个 int 连续内存。它不调用构造函数(对 POD 类型),也不涉及堆操作,快且确定。
常见错误是把变量当大小:int n = 10; int arr[n]; —— 这在标准 C++ 中非法(GCC 允许是 GNU 扩展,但不是 portable)。C++11 起支持 std::array<int></int> 替代,大小仍是编译期常量。
- 适用场景:已知固定尺寸、生命周期和栈空间足够(比如缓存小缓冲区、矩阵维度)
- 注意
sizeof(arr)返回总字节数,不是元素个数;要算长度得用sizeof(arr) / sizeof(arr[0]) -
std::array更安全:带.size()、支持范围 for、能传值,推荐替代裸数组
动态数组用 new[] 和 delete[]:手动管理,极易出错
想运行时决定大小?用 new int[n] 分配堆内存,返回指针。但它不记录长度,不自动析构对象(对类类型需显式调用构造/析构),且必须配对使用 delete[] —— 写成 delete 会未定义行为。
典型翻车现场:int* p = new int[10]; delete p; → 内存泄漏 + 可能崩溃;或忘记 delete[] 导致堆泄漏。
立即学习“C++免费学习笔记(深入)”;
支持模板化设计,基于标签调用数据 支持N国语言,并能根据客户端自动识别当前语言 支持扩展现有的分类类型,并可修改当前主要分类的字段 支持静态化和伪静态 会员管理功能,询价、订单、收藏、短消息功能 基于组的管理员权限设置 支持在线新建、修改、删除模板 支持在线管理上传文件 使用最新的CKEditor作为后台可视化编辑器 支持无限级分类及分类的移动、合并、排序 专题管理、自定义模块管理 支持缩略图和图
- 参数差异:
new int[n]中n是运行时值,但类型仍需明确(不能new auto[n]) - 性能影响:每次
new[]触发堆分配,比栈慢;频繁分配释放易碎片化 - 兼容性:C++98 起支持,但现代代码应避免直接使用
真正该用的:优先选 std::vector,不是“动态数组”的替代品,而是正确抽象
std::vector 不是语法糖,它封装了容量管理、异常安全拷贝、迭代器、RAII —— 这些你手写 new[] 根本没法轻松搞定。
比如扩容:vector 在 push_back 超限时自动申请新内存、移动旧数据、释放旧内存;而自己用 new[] 得重复造轮子,还容易漏异常路径。
- 初始化:
std::vector<int> v(10);</int>分配 10 个默认初始化int;std::vector<int> v{1,2,3};</int>初始化列表 - 获取原始指针?用
v.data(),比取&v[0]安全(空 vector 时前者返回 nullptr,后者 UB) - 不要用
vector存裸指针管理资源 —— 改用std::unique_ptr或直接存对象
什么时候真得碰裸数组?只有极少数底层场景
比如对接 C API(如 OpenGL 的 glVertexAttribPointer 要求连续内存)、嵌入式无 STL 环境、或高性能计算中极致控制内存布局。
这时若必须用,优先考虑 std::array(静态)或 std::unique_ptr<t></t>(动态)—— 后者自动 delete[],避免手动匹配问题。
-
std::unique_ptr<int> p(new int[100]);</int>→ 析构时自动delete[],比裸指针可靠得多 - 千万别混用:用
new分配单个对象,就用delete;用new[]分配数组,必须用delete[] - 所有裸数组操作(越界访问、长度误判、释放遗漏)都不会被编译器拦住,靠人盯,容易忽略
最麻烦的从来不是“怎么写”,而是“谁负责释放”和“长度信息存在哪”。C++ 数组语义简单,但边界和所有权一模糊,问题就藏进运行时里了。








