如何使用“ new”而不是malloc分配内存?

问题描述 投票:1回答:1

作为家庭作业,我必须编写一个围绕结构运行的程序。作为第一个任务,我必须编写一个函数,为指向新结构的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++ arrays pointers memory-management
1个回答
0
投票

您的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可以很好地满足您所有的堆上阵列需求,它永远不会泄漏内存,并且可以轻松调整自身大小。
© www.soinside.com 2019 - 2024. All rights reserved.