【问题标题】:Should i use delete[] in a function? [duplicate]我应该在函数中使用 delete[] 吗? [复制]
【发布时间】:2016-04-03 08:39:02
【问题描述】:
void work() {
  int *p;
  p=new int[10];
  //some code....
}

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

【问题讨论】:

  • 使用new[]delete[]有很多缺点;潜在的内存泄漏只是其中之一。你应该避免使用它们,而是更喜欢std::vector

标签: c++


【解决方案1】:

只要代码不引发异常,这将起作用...

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...
}

【讨论】:

  • 我是初学者,这是我的第一个问题,非常感谢!
【解决方案2】:

你是对的,如果你在函数之外没有引用p,例如一个全局变量,那么你需要在函数内部调用delete [] p,否则你想要释放的分配内存的引用会丢失。

【讨论】:

  • new [] 的调用必须与对delete [] 的相应调用相匹配。省略括号是未定义的行为。
  • 我省略了括号,因为我没有写实际的代码,我会更新答案。
【解决方案3】:

是的,如果整数使用new int[10] 分配,则需要使用delete[] 进行清理,因为它是一个数组。

【讨论】:

    【解决方案4】:

    是的,你需要从new释放内存。

    在 C++11 中,您可以使用智能指针:

    void work() {
      std::unique_ptr<int[]> p{ new int[10] };
      //some code....
      // RAII will delete[] magically here
    }
    

    或者,如果您只使用编译时已知的几个整数(在您的情况下为 10),您可以使用“正常”或static 数组。例如

    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
    }
    

    【讨论】:

    • 如果要使用编译时已知的固定数量的整数,即。
    • 如果这是您的第一个代码,请使用std::vector。如果这是学校代码,请使用delete[],因为在学校他们教你C with classes,无论好坏,他们希望看到你可以自己管理内存,就像在C 中一样。跨度>
    猜你喜欢
    • 2011-01-12
    • 2017-03-05
    • 1970-01-01
    • 2017-06-03
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2010-10-06
    相关资源
    最近更新 更多