返回new分配的数组指针本身合法,但调用方必须明确承担delete[]责任,否则必然内存泄漏;误用delete而非delete[]将触发未定义行为;推荐优先使用std::vector或std::unique_ptr替代裸指针以确保自动、安全的内存管理。

返回 new 分配的数组指针时,必须明确所有权归属
直接返回 new int[n] 得到的指针本身没问题,但调用方必须知道这是堆分配、需手动 delete[],否则必然内存泄漏。C++ 没有自动内存管理,返回裸指针就等于把释放责任“甩”给调用者——而多数人会忘。
常见错误现象:int* arr = createArray(10); 之后没写 delete[] arr;,跑几次就泄露几十 MB;更糟的是,有人误用 delete arr;(漏掉 []),触发未定义行为,程序偶发崩溃。
- 使用场景:仅限性能敏感、明确控制生命周期的底层模块(如图像处理缓存、硬件驱动缓冲区)
- 参数差异:
new int[n]返回int*,不是int[n](C++ 不允许返回栈数组,也不允许返回数组类型本身) - 绝对不要返回局部
new数组的指针然后在函数里delete[]——那返回的是悬空指针
用 std::vector 替代裸指针是更安全的默认选择
std::vector 内部管理堆内存,拷贝/移动时自动处理资源,且支持范围访问、size 查询,语义清晰。它不是“替代方案”,而是 C++11 后的标准解法。
示例对比:
int* bad_create(int n) {
return new int[n]; // 调用者必须 delete[]
}
std::vector<int> good_create(int n) {
return std::vector<int>(n); // 自动管理,无泄漏风险
}</int></int>
性能影响几乎为零:现代编译器对 std::vector 的返回值优化(RVO/NRVO)会让它和裸指针一样快;兼容性上,std::vector 在 C++11 及以上完全可用,且可直接用 .data() 获取底层指针(如需传给 C 接口)。
需要返回指针且不想用 vector?用 std::unique_ptr
如果接口契约强制要求返回指针(比如对接旧代码或特定 API),又想避免手动 delete[],std::unique_ptr<int></int> 是唯一合理选择。它把所有权语义编码进类型里,编译器强制你处理释放逻辑。
关键点:
- 必须用数组特化版本:
std::unique_ptr<int></int>,不能写成std::unique_ptr<int></int>(后者只匹配new int) - 创建方式:
return std::unique_ptr<int>(new int[n]);</int>或更推荐的return std::make_unique<int>(n);</int>(C++14+) - 调用方拿到后,可用
.get()获取原始指针,但析构时自动调用delete[]
别踩 std::shared_ptr 这个坑
std::shared_ptr 默认用 delete,不是 delete[]。即使你显式传入自定义删除器,也容易写错或遗漏——比如写成 [](int* p) { delete p; }(漏掉 []),后果同裸指针误删。
除非你确实需要共享所有权且能 100% 控制删除器实现,否则没必要用 std::shared_ptr<int></int>。绝大多数场景,std::unique_ptr<int></int> 或 std::vector 更直接、更难出错。
真正容易被忽略的是:返回堆数组指针这件事本身,往往暴露了设计问题——是不是本该用容器封装数据?是不是该把生命周期管理移到更高层?裸指针不该是第一反应,而应是权衡后的明确选择。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











