我只是想知道如何进行,或者甚至需要delete []
这样声明的数组:
int* arrgen(int x)
{
int *newarray = new int[x];
return newarray;
}
在函数返回后如何删除newarray
?或者是" auto"函数返回后delete
以及函数原生的其余变量吗?
答案 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 pointers和RAII。
您的原始代码似乎没有所有权策略,这意味着它可能是危险的。调用你的函数的代码需要承担返回指针的所有权,并且必须小心删除它 - 如果你的函数被广泛使用,可能在很多不同的地方。这解释了为什么有人评论“只是不返回分配的东西”,以及为什么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);