gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:51:15 25 4
gpt4 key购买 nike

假设我有以下类(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 .

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?

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com