【问题标题】:Destructor delete dynamic array declared in main析构函数删除 main 中声明的动态数组
【发布时间】:2014-03-02 12:59:20
【问题描述】:

我已经在 int main 中声明了动态数组,所以我的问题是如何在析构函数中删除和释放该数组?否则我应该在 main.
删除[] ptr ---
请回答我这个简单的问题。提前致谢

我也实现了类,但在 main 中声明了动态数组,那么析构函数有什么用?我应该在析构函数中删除吗?

【问题讨论】:

  • main 不是对象,也没有析构函数。在您返回之前将其删除。 (实际上,由于程序无论如何都会退出,因此操作系统无论如何都会回收内存,但自己动手是一种很好的形式和习惯。)
  • 析构函数(和构造函数)是对象(&结构)的成员函数。 'main' 是一个经典函数,就像在 C 中一样。没有这样的析构函数。
  • 请出示您的代码。析构函数是在 object 的生命周期结束时运行的东西,并且您没有谈论任何对象。

标签: c++


【解决方案1】:

程序本身没有析构函数。它从main 的开头开始,到main 的结尾结束。如果你需要释放在main开头分配的一些内存,你应该在main结束之前完成:

int main() {
  int* arr = new int[10];

  // Do lots of work

  delete[] arr;
}

当然,如果你使用 RAII 将这个内存分配封装在一个类中会更好,这样你就不必手动处理它了。事实上,已经存在用于此的类型 - 标准库容器(例如 std::vectorstd::array)。

【讨论】:

  • 那么析构函数在类中有什么用??在这种情况下我不应该使用它吗?
  • @user3215228 类的析构函数应该释放它在其构造函数中分配的所有内存。
  • @user3215228:如果您使用 std::vector(如您所愿),那么 std:vector 析构函数将自动处理内存的释放。使用像 std::vector 这样的标准容器类将大大减少您必须编写自己的析构函数的次数。
【解决方案2】:

每个范围都有退出点。您可以使用 this 和析构函数来实现 RAII 成语。由于您没有用于包装数据的类,因此您可以使用boost 库来定义要在范围退出时执行的操作。

{ // some scope, maybe that of a main function
    double *new_ar = new double[15];
    BOOST_SCOPE_EXIT(new_ar) {
        delete[] new_ar;
    } BOOST_SCOPE_EXIT_END
} // end of scope

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2021-11-20
    相关资源
    最近更新 更多