作为家庭作业,我必须编写一个围绕结构运行的程序。作为第一个任务,我必须编写一个函数,为指向新结构的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编写它。
您的C代码分配指向Structure
的指针的数组。我不知道为什么要这样做,而不是简单地分配Structure
的数组],你必须问任务的作者。
使用new
的直接等效项如下所示:
Structure** allocating(int N) { struct Structure** tab = new Structure*[N]; for (int i = 0; i < N; i++) { tab[i] = new Structure; } return tab; }
解除分配可能有点棘手:
void deallocating(Structure** tab, int N) { for (int i = 0; i < N; i++) { delete tab[i]; //delete objects } delete[] tab; //delete array itself, notice the [] after delete! }
如果可以移动到对象数组而不是指针数组,则代码将变得更加简单:
))。Structure* allocating(int N) { return new Structure[N]; }
后来您也用
delete[]
取消分配了它>正如注释中所注意到的,在C ++中,我们不希望直接使用内存管理(尤其是在现代C ++关键字
new
中被认为是难闻的气味
std::vector
可以很好地满足您所有的堆上阵列需求,它永远不会泄漏内存,并且可以轻松调整自身大小。