我是 C++ 新手。根据我的阅读,与 java 不同,C++ 没有自动垃圾处理,因此在类中我们为对象添加析构函数:
class A{
class A();
~class A(); // destructor
};
我很好奇当我们使用结构时会发生什么。另外,当我们不向类添加析构函数时会发生什么?内存是如何释放的?
我是 C++ 新手。根据我的阅读,与 java 不同,C++ 没有自动垃圾处理,因此在类中我们为对象添加析构函数:
class A{
class A();
~class A(); // destructor
};
我很好奇当我们使用结构时会发生什么。另外,当我们不向类添加析构函数时会发生什么?内存是如何释放的?
我认为回答的一个好方法是将 Java 与 C++ 进行比较。在 Java 中,所有引用类型都存储在堆中,而所有原语都存储在堆栈中。这意味着,原语在超出范围时被销毁;也就是说,只要声明它们的方法返回。另一方面,引用类型并非如此。
在 C++ 中,您可以控制动态(在堆中)或自动(在堆栈中)存储的变量。如果您使用new
运算符创建一个对象,它会保留在堆中,直到您使用相应的delete
. 如果您在没有运算符的情况下创建变量(或对象)new
,则当对象超出范围时会释放其内存。
回答您关于构造函数和析构函数的问题:构造函数是一种始终在创建新对象时调用的方法。如果您不指定任何构造函数,则默认的构造函数(不带参数)是隐含的。当对象超出范围时调用析构函数,或者如果您使用delete
运算符删除它(在您使用 动态创建它的情况下new
)。
C++ 没有任何垃圾收集。这几乎是真的。析构函数是一个非常有用的工具,也用于收集垃圾。
在一个类中有 4 种预定义方法:默认构造函数、复制构造函数、赋值运算符的重载和析构函数。这意味着此方法具有默认版本:
当您定义时:
class A {
private:
int* a;
public:
A() { a = new int(5); }
};
默认析构函数只会擦除指针本身分配的内存,而不释放占用的内存int(5)
。
因此我们需要定义一个特定的析构函数:
~A() { delete a; }
甚至更好地使用智能指针。
适用于类的相同规则也适用于 C++ 中的结构,但默认访问级别除外,其他没有。
如果你没有定义析构函数,编译器会为你定义一个默认的析构函数。对于类和结构。
默认构造函数调用基类的析构函数和拥有它们的所有成员的析构函数。默认析构函数只是一种商品,以防您不需要对类进行任何特殊处理,您不需要手动编写空版本(例如从堆中释放动态分配的对象,或管理非自动成员)。
C++ 中结构和类的唯一区别是默认访问控制——默认情况下,成员在类中是私有的,而在结构中是公有的。如果你没有定义自己的析构函数,编译器会给你一个默认的析构函数;当对象被销毁时,所有成员也都被销毁。如果任何类成员指向堆分配的内存,您只需要定义自己的析构函数。