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
相关产品推荐
相关产品推荐

