void work() {
int *p;
p=new int[10];
//some code....
}
我有一个简短的问题,在工作功能中,我应该使用delete []运算符吗?因为当工作功能结束时, p 将被销毁,这是错误还是正确? (我的英语不好,对不起)。
答案 0 :(得分:4)
只要代码没有引发异常,这将有效...
void work() {
int *p;
p=new int[10];
//some code....
delete [] p;
}
这更好(但难以维护):
void work1() {
int *p;
p=new int[10];
try {
//some code....
} catch(...) {
delete [] p;
}
delete [] p;
}
这好多了......
void work2()
{
auto p = std::unique_ptr<int[]>(new int[10]);
// some code...
// memory is automatically deleted
}
这就是你应该怎么做......
void work3()
{
auto v = std::vector<int>(10);
// some code...
}
答案 1 :(得分:2)
你是对的,如果你在函数之外没有引用p
,例如一个全局变量,然后你需要在函数内部调用delete [] p
,否则你想要释放的分配内存的引用就会丢失。
答案 2 :(得分:1)
是的,如果使用new int[10]
分配整数,则需要使用delete[]
进行清理,因为它是一个数组。
答案 3 :(得分:1)
是的,您需要从新版本中释放内存。
或者使用C ++ 11,您可以使用智能指针:
void work() {
std::unique_ptr<int[]> p{ new int[10] };
//some code....
// RAII will delete[] magically here
}
或者,如果您只使用几个整数(在您的情况下为10),这在编译时是已知的,您可以执行“normal”或static
数组。 e.g。
void work() {
/* static */ int p[10];
//some code....
}
或者,使用std::vector
:
void work() {
std::vector<int> p{10};
//some code....
// RAII will delete[] magically here
}
或者,如果在编译时已知数组大小,则使用C++11
,使用std::array
:
void work() {
std::array<int,10> p;
//some code....
// RAII will delete[] magically here
}