我是一名帮助翻译的助手。
我有个关于析构函数的基础问题。
假设我有以下类:
class A
{
public:
int z;
int* ptr;
A(){z=5 ; ptr = new int[3]; } ;
~A() {delete[] ptr;};
}
现在析构函数应该销毁一个对象的实例。 上述析构函数正是如此,在释放由new动态分配的内存时实现了这一点。
但是变量z怎么办?我应该如何手动销毁它/释放由z分配的内存?当类超出范围时,它是否会自动销毁?
我是一名帮助翻译的助手。
我有个关于析构函数的基础问题。
假设我有以下类:
class A
{
public:
int z;
int* ptr;
A(){z=5 ; ptr = new int[3]; } ;
~A() {delete[] ptr;};
}
尽管在您的示例中int z
是POD类型,因此不存在显式析构函数,但它会自动“销毁”...内存被回收。否则,如果该对象有析构函数,则在主类A
的析构函数体完成但未退出后,将调用该析构函数以正确清理该非静态数据成员的资源。
z
会被自动销毁。对于每个“自动”的变量都会这样。即使是指针,比如int*
、float*
、some_class*
等等也是如此。然而,当原始指针被销毁时,它们并没有自动进行delete
操作。这就是智能指针的行为。
由于这个属性,人们应该始终使用智能指针来表达所有权语义。它们在复制/移动构造函数/赋值运算符中也不需要特殊提及,在使用智能指针时,大多数情况下甚至不需要编写它们,因为它们自己完成了所有必要的工作。
int *ptr
)也具有自动存储期,并且会自动销毁。只是销毁指针不会调用指针上的 delete
。 - bames53销毁一个对象将同时销毁该对象的所有成员变量。您只需要删除指针,因为销毁指针并不会做任何事情 - 特别是它不会销毁指针所指向的对象或释放其内存。
事实上,当类超出范围时,它会自动销毁。一个很好的猜测方法是,在其声明后没有*
。
std::string aStr;
),它们的析构函数将被自动调用。您只需要手动处理内存释放(如上所述)或任何其他手动对象或数据清理(如关闭文件、释放资源等)。
z
将被自动清除。您必须删除ptr
,因为它是堆分配的,但z
没有在堆上分配。 - wklstd::vector
而不是数组将避免定义析构函数以及三五法则问题。 - Fred Larson