如何手动销毁成员变量
How to manually destroy member variables?
我有一个关于析构函数的基本问题。
假设我有以下类
class A
{
public:
int z;
int* ptr;
A(){z=5 ; ptr = new int[3]; } ;
~A() {delete[] ptr;};
}
现在,析构函数应该销毁对象的实例化。上面的析构函数正是这样做的,释放了new分配的动态分配内存。
但是变量z
呢?我应该如何手动销毁它/释放z
分配的内存?当类超出范围时,它会自动销毁吗?
它会自动"销毁",尽管在您的示例中int z
是POD类型,因此没有显式的析构函数。。。存储器被简单地回收。否则,如果对象有一个析构函数,那么在主类A
的析构函数主体完成但未退出后,将调用它来正确清理该非静态数据成员的资源。
z
自动销毁。每一个"自动"变量都会发生这种情况。即使是像int*
、float*
、some_class*
等指针。然而,当原始指针被破坏时,它们也不会自动成为delete
d。这就是智能指针的行为方式。
由于该属性,应该始终使用智能指针来表达所有权语义。它们也不需要在复制/移动构造函数/赋值运算符中特别提及,大多数时候,当使用智能指针时,您甚至不需要编写它们,因为它们自己可以完成所有需要的操作。
销毁一个对象也会销毁该对象的所有成员变量。您只需要删除指针,因为销毁指针不会有任何作用——特别是它不会销毁指针指向的对象或释放其内存。
事实上,当类超出范围时,它会自动销毁。猜测是否是这种情况的一个很好的方法是在声明之后没有*
。
对于像int、float等PODS(普通的旧数据类型),它们会自动销毁。如果有对象作为数据成员(例如std::string aStr;
),则会自动调用它们的析构函数。您只需要手动处理内存释放(如上所述)或任何其他手动对象或数据清理(如关闭文件、释放资源等)。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查