【发布时间】:2021-12-11 14:14:58
【问题描述】:
假设我们有一个简单的结构
struct S {
int a;
int b;
int c;
}
现在我们要创建一个指针数组(二维数组 5x5):
S** arr = new S*[5];
for (int i = 0; i < 5; ++i)
arr[i] = new S[5];
我的问题是:
- 使用
new为该数组动态分配内存是否正确?我们不应该在某个地方使用sizeof(S)吗? - 如果使用
malloc而不是new,代码会是什么样子?下面的代码是否正确?
S** arr = (S**)malloc(5 * sizeof(S));
for (int i = 0; i < 5; ++i)
arr[i] = (S*)malloc(5 * sizeof(S));
【问题讨论】:
-
在
S中添加一个不可复制的成员,然后malloc代码就惨败了。 -
动态分配这个数组的正确方式是
std::vector<std::vector<S>>。您的new版本属于“技术上工作”,malloc属于“未定义行为”。 -
@OP 这个“简单结构”使用
malloc失败:struct S { std::string str; };。那一个std::string成员会导致 malloc 代码损坏。 -
@PaulMcKenzie 但我不在这里使用
std::string。 -
@Quentin
malloc有什么问题?
标签: c++ arrays malloc dynamic-memory-allocation new-operator