说我有以下类(class):

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

最佳答案

销毁者会销毁其自己的成员,但是,可以肯定的是,销毁者仅指向该成员,而与它无关。换句话说,您必须手动清除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的信息。



如果您将对象的作用域包含在循环体内,则可以,每次变量超出作用域(循环结束)时,它所保存的数据将被销毁,并在下一次重新创建。可以避免不必要和昂贵的分配/重新分配。您可能会公开一个辅助函数,例如assign,该函数会接收您要用来替换旧数据的数据,并将其分配给data指向的对象。现在,您可以在循环主体外部使用A obj,并且每次在循环内部都需要assign

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

关于c++ - 类的析构函数是否自动为char *类型的数据成员释放内存? C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35499044/

10-11 19:38
查看更多