C++11中用new初始化static指针数组是否安全合规?
问题解答
你的猜测是否正确?
完全正确。new const int[3] {1,2,3}会在堆上分配一块内存,用初始化列表的值完成初始化,这块内存的生命周期不会随着当前作用域结束而销毁,直到你主动调用delete[]释放它。而静态数组vss里存储的是这块堆内存的地址,只要程序还在运行,这个地址就始终有效,不会出现临时对象丢失的问题。
这种用法在C++11中是否安全合规?
是合规的。C++11标准明确支持:
- 用初始化列表直接初始化
new分配的数组(包括const修饰的数组) - 静态局部变量的初始化只会在函数第一次调用时执行一次,所以
new只会被调用一次,不会重复分配内存。
注意事项:内存泄漏
虽然这种写法能满足需求,但存在一个小问题:这块堆内存永远不会被释放。因为静态变量vss的生命周期是整个程序运行期间,程序结束后操作系统会回收所有内存,所以不会有长期的资源占用问题,但严格来说属于内存泄漏。如果想要更规范的写法,可以用std::array替代堆分配:
#include <array> int undef() { static const int vs[3] {1,2,3}; static const std::array<int, 3> arr2{1,2,3}; static const int* vss[2] { vs, arr2.data() // 或者 &arr2[0] }; return vss[0][1] + vss[1][1]; }
std::array是栈上的静态对象,生命周期和vs一致,不需要手动管理内存,安全性和可读性都更好。
内容的提问来源于stack exchange,提问作者B98
相关产品推荐
相关产品推荐

