这个问题来自我试图理解智能指针的动机,在智能指针周围您创建了一个包装类,以便可以添加自定义析构函数。指针(以及整型,布尔型,双精度型等)没有析构函数吗?
原始类型(及其化合物)具有平凡的破坏者。这些命令不执行任何操作,并具有特殊的措词,使某些情况下可以完全跳过它们。
但是,这与C ++具有智能指针的原因正交。原始指针是没有所有权的:它指向另一个对象,但不影响其寿命。另一方面,智能指针拥有(或共享)他们的指针,将指针的寿命与自己的指针联系在一起。这是在析构函数的内部以及其他特殊函数中实现的。
不,指针没有析构函数。通过普通旧指针引用的对象必须为delete
d,以避免内存泄漏,然后调用该对象的析构函数,但是即使指针超出范围,编译器也不会自动调用delete
-如果程序的另一部分也有指向同一对象的指针?
智能指针不是要调用自定义析构函数,而是要确保在超出范围时自动将其清除。这种“清理”可能是删除拥有的对象,free
清理所有malloc
的内存,关闭文件,释放锁等。
如果不从堆分配新内存,则不需要析构函数。
C和C ++有两种存储变量的方法:堆栈和堆。
堆栈用于静态内存,由编译器负责。堆用于动态内存,如果使用它,则必须注意这一点。
当执行基本类型声明时,将为变量分配堆栈存储器。
[当您使用new
声明一个对象时,该对象存储在堆上,在使用完该对象时需要将其删除,否则可能会导致内存泄漏。
基本上,如果您有新内容,则只需要delete
。