You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态分配的单个T类型对象指针能否安全用作数组首元素指针?

指向单个动态分配对象的指针能否安全用作数组首元素指针?

核心结论

不能直接把指向单个自由存储区分配的T类型对象的指针,当作数组首元素指针来访问超出单个对象范围的元素——这种操作属于未定义行为,和实际内存是否有空闲空间无关,C++标准不保证其安全性。

为什么你给出的例子是未定义行为?

你写的代码:

int* pi = new int{5};
pi[1] = 10;

问题在于:new int{5}只分配并构造了单个int对象,它不属于数组类型的存储。C++标准规定,指针的算术运算(包括下标访问pi[n]等价于*(pi+n))只有在指针指向数组元素(或数组末尾的后一个合法位置)时才是合法的。对于单个对象来说,pi+1已经超出了该对象的存储范围,这个指针本身就是无效的,后续的赋值操作自然也是未定义行为。

安全实现类似需求的方法

如果需要使用支持数组式访问的连续内存,有两种可靠的方式:

  1. 直接分配数组类型的内存
    用数组形式的new来分配连续的多个对象,此时指针指向数组首元素,下标访问完全合法:
// 分配包含2个int的数组,pi指向首元素
int* pi = new int[2];
pi[0] = 5;
pi[1] = 10;
// 必须用delete[]释放数组内存,否则会导致内存泄漏或未定义行为
delete[] pi;
  1. 使用标准库容器(推荐)
    std::vector<T>是C++中管理动态数组的首选方式,它会自动处理内存分配、释放和对象构造,避免手动管理的风险:
#include <vector>

// 创建一个包含2个int元素的vector,初始值默认是0
std::vector<int> vec(2);
vec[0] = 5;
vec[1] = 10;
// 无需手动释放内存,vec销毁时会自动清理所有资源

另外,如果只是想用数组下标语法访问单个对象的首元素(也就是pi[0]),这是完全合法的,因为pi[0]等价于*pi,属于单个对象的合法访问范围。

内容的提问来源于stack exchange,提问作者CuriousCrypto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:47:13