如何在函数返回后删除堆分配的变量

时间:2014-03-13 05:53:30

标签: c++ arrays pointers heap

我只是想知道如何进行,或者甚至需要delete []这样声明的数组:

int* arrgen(int x)
{
    int *newarray = new int[x];
    return newarray;
}

在函数返回后如何删除newarray?或者是" auto"函数返回后delete以及函数原生的其余变量吗?

4 个答案:

答案 0 :(得分:3)

不,在这种情况下你必须从函数外部删除。无论如何,如果从函数内部删除,返回时会有一个悬空指针,所以没有任何意义。

如果要自动释放,请使用c ++ 11:

执行此操作
std::unique_ptr<int []> newarray(new int[x]);
return newarray;

这将返回newarray,当您停止使用时,它会通过delete []析构函数调用unique_ptr

答案 1 :(得分:0)

C ++让您可以控制内存管理(与C#或Java等垃圾收集语言不同,后者为您提供服务)。因此,您可以使用new(new [] for arrays)分配内存,并在您认为合适时使用delete(数组的delete [])取消分配。

这可能更像是一种诅咒而不是一种祝福 - 有很多方法可能会出错。如果对同一地址调用“删除”两次,则会出现未定义的行为(例如程序崩溃)。如果您使用new分配内存但无法将其删除,那么您就会出现“内存泄漏” - 随着程序的运行,它会随着内存使用量的增长而增长。

为了避免这些问题,您确实需要一种管理内存的策略。对于分配的每一块内存,从您的策略中应该清楚哪些代码“拥有”内存并负责删除它。两种常见策略是smart pointersRAII

您的原始代码似乎没有所有权策略,这意味着它可能是危险的。调用你的函数的代码需要承担返回指针的所有权,并且必须小心删除它 - 如果你的函数被广泛使用,可能在很多不同的地方。这解释了为什么有人评论“只是不返回分配的东西”,以及为什么Germán建议使用智能指针。

答案 2 :(得分:0)

你可以像这样制作newarray:

int* arrgen(int x) {
  static int *newarray = new int[x];
  return newarray;
}

这样,退出函数后,数组不会从堆栈中删除。然后在main()里面你可以这样做:

int* vector = arrgen(n);
...
delete [] vector;

答案 3 :(得分:0)

  

如何在函数返回后删除newarray?

你不会。函数返回时删除新数组意味着返回指向数组的无效引用/指针。

您想要的是使用std::vector

std::vector<int> arrgen(int x) {
    std::vector<int> newarray(x);
    return newarray;
}

并将其退回(感谢RVO,您根本不需要支付任何副本)。

但是,嘿,那只是std::vector的构造函数。所以你甚至不需要为它创建一个函数:

std::vector<int> newarray(x);