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 提出这个问题。您可以使用其 reserve
、assign
和其他函数来获得优雅的 和 高性能解决方案。
假设我有以下 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 提出这个问题。您可以使用其 reserve
、assign
和其他函数来获得优雅的 和 高性能解决方案。