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

C++自定义结构体类型动态分配二维数组的new与malloc用法问题

问题1解答

  • 你给出的new实现代码是完全正确的,不需要额外使用sizeof(S)。
  • 原因:C++的new/new[]运算符会自动根据分配的类型计算所需内存大小:
    • 外层new S*[5]会自动计算5个S*类型指针的总大小,不需要手动指定
    • 内层new S[5]会自动计算5个S结构体的总大小,也不需要手动传sizeof(S)
  • 补充说明:这种分配方式得到的是「指针数组构成的二维数组」,每一行的内存是独立分配的,和连续分配的二维数组有底层差异,但如果你的需求就是这种结构,逻辑完全符合要求。

问题2解答

  • 你给出的malloc代码存在错误,错误点在外层分配的大小计算:你要分配的是存储5个S*指针的内存,应该用5 * sizeof(S*),而不是5 * sizeof(S),这个错误会导致分配的内存大小不符合预期,触发未定义行为。
  • 正确的malloc实现代码如下:
// 外层分配5个S*指针的空间
S** arr = (S**)malloc(5 * sizeof(S*));
for (int i = 0; i < 5; ++i) {
    // 内层分配5个S结构体的空间
    arr[i] = (S*)malloc(5 * sizeof(S));
}
  • 注意事项:malloc只负责分配原始内存,不会对结构体做任何初始化,也不会调用构造函数。如果你的S结构体后续添加了自定义构造函数、虚函数等非平凡特性,直接用malloc分配的S实例是未初始化的,需要配合定位new(placement new)完成构造才能正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:06:07