【问题标题】:Does the destructor of a class automatically deallocate memory for data members of type char *? C++类的析构函数会自动为 char * 类型的数据成员释放内存吗? C++
【发布时间】:2016-02-19 06:49:49
【问题描述】:

假设我有以下课程:

class A {
  public:
    A();
    ~A();
    //...some other functions

  private:
      char * data;
}

问题1:我是否必须明确定义析构函数如下:

//destructor
A::~A() {
  delete [] data;
}

或者,编译器是否隐式执行此操作?

问题 2: 如果我在一个循环中反复在 main 中使用相同的构造类怎么办,A 类的数据成员是否会在每次循环后释放其内存?如果不是,我应该明确地这样做吗?

即:

int main() {
    A obj;
    for (int i = 0; i < 3; ++i)
        getData(obj); //this function will store an input 3 times inside `data`
    return 0;
}

【问题讨论】:

  • “或者,编译器是否隐含地这样做了?” 没有。“A 类是否在每次循环后释放其内存?” 把@ 987654325@ 在循环体内。
  • @πάνταῥεῖ 我必须这样做吗?
  • @Lieft1951 可以,否则会导致内存泄漏。
  • Q1:c++ 存储数据的方式是使用 std::string 或 std::vector。它们将在销毁时自动释放。原始指针不会被释放。
  • 对于每个new,您需要有一个delete。还有什么好聊的?

标签: c++ destructor


【解决方案1】:

析构函数会销毁它自己的成员,当然,但只有成员,它指向的内容与它无关。换句话说,你必须手动清理你让data 指向的任何东西。所以,是的,您需要在析构函数中显式执行此操作。

或者,您可以使用 C++11 的 std::unique_ptr,而不是自己管理它,在这种情况下,类析构函数将调用 std::unique_ptr 的析构函数,这将回收您分配的内存。一个SSCCE

#include <memory>

class myClass {
  std::unique_ptr<int[]> data;

public:
  myClass() : data(new int[5]{1, 21, 9, -1}) { }
};

在这种情况下,您甚至不需要定义析构函数,编译器提供的默认析构函数就可以了。阅读新的Rule of Zero

如果我在循环中重复使用 main 中相同的构造类,A 类的数据成员会在每次循环后释放其内存吗?如果不是,我应该明确地这样做吗?

如果你的对象的范围在循环体中,那么是的,每次变量超出范围(循环结束)时,它所持有的数据都会被销毁,并且下一次会被重新创建;可以避免这种不必要且昂贵的分配/解除分配。您可能会公开一个辅助函数,例如assign,它接收您要替换旧数据的数据并将其分配给data 指向的对象。现在你可以在循环体之外有A obj,每次在循环内你只需要assign

标准 C++ 库中已经有一个容器来执行此管理内存的低级任务:std::vector。我不确定这是否是您想要的,但感谢 Galik 提出这个问题。您可以使用它的reserveassign 和其他功能来获得优雅的高性能解决方案。

【讨论】:

  • std::stringstd::vector&lt;char&gt; 不是比智能指针更合适吗?
  • 我不确定stringvector 可能是合适的;这取决于OP想要什么。查看更新的答案。
猜你喜欢
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多