我应该在函数中使用delete []吗?

时间:2016-04-03 08:39:03

标签: c++

void work() {
  int *p;
  p=new int[10];
  //some code....
}

我有一个简短的问题,在工作功能中,我应该使用delete []运算符吗?因为当工作功能结束时, p 将被销毁,这是错误还是正确? (我的英语不好,对不起)。

4 个答案:

答案 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
}