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

C++动态内存分配时new运算符后的()和[]有什么区别?

问题核心原因

C++ 中new表达式的方括号[]和圆括号()作用完全不同,你对p2的操作属于越界访问的未定义行为,这是报错的根源。

两个new语句的具体差异

  • int* p1 = new int[5];
    这行是分配长度为5的int类型数组,返回的是数组首元素的指针,合法的下标访问范围就是你说的0~4,所以p1[4] = 1的操作完全合法,不会报错。
  • int* p2 = new int(5);
    这行是分配单个int类型的变量,圆括号里的5是给这个单个变量设置的初始值,返回的是指向单个int的指针,你只能合法访问p2[0](也就是*p2),访问p2[4]相当于操作了不属于你申请的内存空间,属于越界访问,触发运行时报错是符合预期的。

记忆区分规则

new 后加方括号[]对应数组分配,括号内参数为数组长度;new 后加圆括号()对应单个对象分配,括号内参数为对象的初始化值。

如果你的需求是让p2也指向长度为5的数组,把对应行改成int* p2 = new int[5];即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:24:06