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

Does the destructor of a class automatically deallocate memory for data members of type char *? C++

假设我有以下 class:

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

  private:
      char * data;
}

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

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

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

问题2:如果我在循环中重复使用同一个构造的class怎么办,class的数据成员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;
}

析构函数会销毁它自己的成员,当然,但是,只有成员,它指向的是它的业务 none。换句话说,您必须手动清理您 data 指向的任何内容。所以,是的,您需要在析构函数中明确地执行此操作。

或者,您可以使用 C++11 的 std::unique_ptr,而不是自己管理它,在这种情况下,class 析构函数将调用 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.

What if I used the same constructed class in main repeatedly inside a loop, does the data member of class A deallocates its memory after each loop? If not, should I do it explicitly?

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

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