【问题标题】:Freeing a vector allocated in a class? [duplicate]释放类中分配的向量? [复制]
【发布时间】:2013-06-20 10:44:33
【问题描述】:

我有一个在类中声明的结构向量。我的问题是我必须在类析构函数中显式释放向量分配的内存,还是在销毁实例时自动完成。如,我是否必须在类析构函数中包含代码以释放向量的内存。

【问题讨论】:

  • 你用的是什么向量?
  • 没有。 std::vector 在其生命周期结束时销毁其内容。
  • @CongXu 好的。谢谢

标签: c++ memory-management vector


【解决方案1】:

如果您自己使用new 分配结构,那么您需要在使用完它们后使用delete 释放它们。 std::vector 不会为你这样做。

Effective C++(强烈推荐)一书中的第 13 项说使用对象来管理资源。这可以帮助您避免诸如必须担心您的资源取消分配代码不会被调用等问题,例如,抛出异常。如果您使用的是 C++11,您可以查看 shared_ptr 或创建您自己的资源管理类。

更新:正如 jogojapan 指出的,std::auto_ptr 不适合 STL 容器。

【讨论】:

  • 啊.. 谢谢@jogojapan 我总是忘记这一点.. 我会更新我的答案
  • 如果你使用new分配东西,你必须使用delete释放它们。 free 用于使用 malloc 进行分配。
  • 感谢@Pixelchemist - 我最近在纯 C 语言上花费了太多时间!
【解决方案2】:

不管你有没有自己的析构函数: 类的每个成员都将调用其析构函数(请记住:如果成员是指针并且您手动分配了内存,则需要释放析构函数主体中分配的内存,因为自动销毁将破坏指针但不会释放它指向的内存)。

C++ 标准规定,在析构函数主体之后,所有非变体非静态数据成员都将调用其析构函数。

【讨论】:

    【解决方案3】:

    如果你没有析构函数并且向量是类成员,它将被编译器生成的默认析构函数隐含。

    默认析构函数调用基类的析构函数和 派生类的成员。

    反向调用基类和成员的析构函数 其构造函数的完成顺序:

    类对象的析构函数在析构函数之前调用 成员和基地被称为。非静态成员的析构函数是 在调用基类的析构函数之前调用。析构函数 在虚拟基的析构函数之前调用非虚拟基类 类被调用。

    关于你自己提供的析构函数:

    类的析构函数(无论你是否明确定义) 自动调用成员对象的析构函数。他们是 以相反的顺序销毁,它们出现在声明中 班级。

    There are still the differences...

    【讨论】:

    • 你的报价来源是什么?
    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多