【问题标题】:How do I allocate memory with "new" instead of malloc?如何使用“new”而不是 malloc 分配内存?
【发布时间】: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 using new.
  • 真的要分配内存吗?您可以使用向量来避免内存分配和释放的整个任务。整个函数可以替换为std::vector&lt;Structur&gt; 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


【解决方案1】:

您的 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[] 释放它


正如在 cmets 中所注意到的,在 C++ 中我们更愿意不直接使用内存管理(尤其是在现代 C++ 中,关键字 new 被认为是一种难闻的气味)。 std::vector 可以很好地处理所有堆上数组的需求,它永远不会泄漏内存并且可以轻松调整自身大小。

【讨论】:

  • new 可能有异味,但已有超过 2 年的代码库使用它。非常值得了解。
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2012-07-28
相关资源
最近更新 更多