类的析构函数是否会自动为char *类型的数据成员释放内存? C ++

时间:2016-02-19 06:49:50

标签: c++ destructor

说我有以下课程:

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

1 个答案:

答案 0 :(得分:4)

析构函数会破坏自己的成员,当然,只有成员,它所指的是它的业务。换句话说,您需要手动清理您要指向的任何内容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和其他功能来获得优雅的性能解决方案。