【发布时间】:2020-02-03 16:14:06
【问题描述】:
作为作业,我必须编写一个围绕结构运行的程序。作为第一个任务,我必须编写一个函数,为指向新结构的 N 指针数组分配内存(用户决定 N 的值)并返回数组的地址。我遇到的第一个问题是理解 malloc 的形式。我问我的教授使用“new”相当于什么,因为它对我来说更透明,但他回答说我应该坚持使用 malloc,这样我就可以避免犯任何错误。以下函数如下所示:
struct Structure
{
int a;
char b;
float c;
};
Structure** allocating(int N)
{
struct Structure** tab = (struct Structure**) malloc(amount * sizeof(struct Structure*));
for (int i = 0; i < N; i++)
{
tab[i] = (struct Structure*) malloc(sizeof(struct Structure));
}
return tab;
}
我尝试理解这种分配内存的形式,但到目前为止,我理解这一点,就好像我正在为指向指针数组的指针分配内存(double **),这不是任务中所说的。总而言之,我不明白分配的编写方式以及使用new如何编写。
【问题讨论】:
-
(struct Structure**)malloc(amount * sizeof(struct Structure*))->new Structure*[amount]; -
如果允许使用
std::vector。如果没有,强烈考虑将您的分配包装在另一个结构中到automate its management。一般avoid directly usingnew. -
真的要分配内存吗?您可以使用向量来避免内存分配和释放的整个任务。整个函数可以替换为
std::vector<Structur> allocating(int N) { return std::vector(N); }。 -
“我应该坚持使用 malloc,这样我就可以避免犯任何错误”,这与他/她应该给你的相反建议。不要使用
malloc,不要使用new。使用容器和 RAII。 -
我问我的教授,使用“new”相当于什么,因为它对我来说更透明,但他回答说我应该坚持使用 malloc,这样我就不会犯任何错误。 i> 小心这个。
malloc有许多你必须注意的失败案例new没有。大的可能是 1) 所有对malloc的调用都需要明确测试是否成功,而new会在失败时抛出异常,从而更难错过。 2)malloc不调用构造函数,free不调用析构函数。它们只能用于简单的数据类型。
标签: c++ arrays pointers memory-management