int* func()
{
int* i=new int[3];
return i;
}
void funcc()
{
int* tmp=func();
//delete allocated memory after use
delete[] tmp;
}
我的意见是编译器在编译funcc时无法知道有3个int要删除,例如func是否在另一个文件中。
答案 0 :(得分:6)
[16.14]在p = new Fred [n]之后,编译器如何知道有n 删除期间要删除的对象[] p?
简短回答:魔术。
答案很长:运行时系统存储对象的数量n, 如果你只知道指针,那么它可以被检索到的地方,p。 有两种流行的技术可以做到这一点。这两种技术 正在商业级编译器使用,两者都有权衡,和 既不完美。这些技巧是:
- 过度分配数组并将n放在第一个Fred对象的左侧。
- 使用关联数组,其中p为键,n为值。
答案 1 :(得分:6)
这就是delete
打算使用的方式,而且很好。数组大小存储在幕后的某个地方,这样delete[]
无论发生在哪里都会做正确的事情。
然而,像这样的杂耍指针容易出错:在删除数组之前很容易丢失指针,或者逻辑变得如此复杂以至于你最终删除了两次相同的数组。你最好用一个类为你管理数组:
#include <vector>
std::vector<int> func() {
return std::vector<int>(3);
}
void funcc() {
auto tmp = func();
// no need to do anything - the vector frees its memory automatically
}