你好,我有几个问题。
假设我有这个代码:
class alumno
{
private:
string nombres;
char telefono[12];
int nivel;
public:
alumno();
~alumno();
}
然后我主要声明
alumno estudiante[10];
我的疑问是:
- 如何调用单个对象的析构函数?
- 如何销毁整个阵列?
- 如果我删除一个对象,数据仍然是空白?还是对象框消失了?(也就是说,如果数组的大小是 10,它会下降到 9 吗?)
1. 如何调用单个对象的析构函数?
在数组中,您可以执行
estudiante[3].~alumno( );
2.如何销毁整个阵列?
正如您所声明的,该数组在函数退出时自动销毁。在说析构之前,数组中包含的对象的析构函数被一一调用。
如果您希望能够随时销毁它,则必须使用动态内存:
如果您使用最后一个公式动态数组,请记住您有责任通过执行
delete[]
. 编译器完全忽略它们。也就是说,它们在退出函数时不会被销毁或释放。3. 如果我删除一个对象,数据仍然是空白?还是对象框消失了?(也就是说,如果数组的大小是 10,它会下降到 9 吗?)
如果实例在数组中,则数组和数据都不会改变。当所涉及的类的析构函数结束时,一切都保持原样。
如果析构函数什么都不做,内存将保持原样。当然,数组中元素的数量不会改变。
认为,从编译器的角度来看,数组只不过是一块内存。一旦被赋值,它就不会改变大小(除非我们明确地改变它)。
小心你做什么。从逻辑上讲,如果先调用一个对象的析构函数,然后再做
delete
整个数组的析构函数,就会再次调用析构函数。由您来检查程序的逻辑。在数组内部,对象是按值存储的,因此不需要调用对象的析构函数。其中,向量内的所述元素占用的内存将不会被释放。
除非有非常正当的理由,否则直接调用驱逐舰是应避免的。如果您使用某些标准进行编程,您将意识到没有必要显式调用它们。
该数组是在不使用动态内存的情况下创建的,因此您无法手动销毁它。当执行离开数组范围时,程序会自动调用数组中每个对象的析构函数。
如果进行了动态内存预留,则将是另一种情况。在这种情况下,必须手动释放内存:
为什么会出现这种不同的行为?
您创建的数组存储在程序的堆栈中。堆栈由程序本身管理,因为它使用它来存储函数的跳转,因此程序知道它必须消除变量。
当您使用动态内存时,您将负责管理所述内存。
不。由于对象不使用动态内存,它不管理文件、套接字等唯一资源。你不会注意到任何区别。析构函数只是编译器知道在某些情况下调用的另一个函数,例如变量超出范围或调用
delete
.