如何手动销毁成员变量?

5

我是一名帮助翻译的助手。

我有个关于析构函数的基础问题。

假设我有以下类:

class A
{
public:

int z;
int* ptr;

A(){z=5 ; ptr = new int[3]; } ;
~A() {delete[] ptr;};

}

现在析构函数应该销毁一个对象的实例。 上述析构函数正是如此,在释放由new动态分配的内存时实现了这一点。
但是变量z怎么办?我应该如何手动销毁它/释放由z分配的内存?当类超出范围时,它是否会自动销毁?

z将被自动清除。您必须删除ptr,因为它是堆分配的,但z没有在堆上分配。 - wkl
7
提醒一下,你正在忽略三法则。 :) - Xeo
好的观点!谢谢 :D - curiousexplorer
2
此外,使用 std::vector 而不是数组将避免定义析构函数以及三五法则问题。 - Fred Larson
5个回答

5

尽管在您的示例中int z是POD类型,因此不存在显式析构函数,但它会自动“销毁”...内存被回收。否则,如果该对象有析构函数,则在主类A的析构函数体完成但未退出后,将调用该析构函数以正确清理该非静态数据成员的资源。


4

z会被自动销毁。对于每个“自动”的变量都会这样。即使是指针,比如int*float*some_class*等等也是如此。然而,当原始指针被销毁时,它们并没有自动进行delete操作。这就是智能指针的行为。

由于这个属性,人们应该始终使用智能指针来表达所有权语义。它们在复制/移动构造函数/赋值运算符中也不需要特殊提及,在使用智能指针时,大多数情况下甚至不需要编写它们,因为它们自己完成了所有必要的工作。


1
指针(如 int *ptr)也具有自动存储期,并且会自动销毁。只是销毁指针不会调用指针上的 delete - bames53

2

销毁一个对象将同时销毁该对象的所有成员变量。您只需要删除指针,因为销毁指针并不会做任何事情 - 特别是它不会销毁指针所指向的对象或释放其内存。


0

事实上,当类超出范围时,它会自动销毁。一个很好的猜测方法是,在其声明后没有*


0
对于 PODS(普通旧数据类型)如 ints、floats 等,它们会自动销毁。如果您有对象作为数据成员(例如 std::string aStr;),它们的析构函数将被自动调用。您只需要手动处理内存释放(如上所述)或任何其他手动对象或数据清理(如关闭文件、释放资源等)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接