关于new delete的说明

一、 删除空指针不会有问题,由于C++的标准规定在delete时首先会判断指针是否为空,为空就再也不处理,因此也就不会有问题。数组

二、 delete一个非空指针以后,并不会将该指针自动置为空。此时若是重复删除或继续访问会出现问题。安全

三、 从上面的两个特性,咱们在delete完一个指针以后,要立刻将其置为空,防止重复delete出现问题。函数

四、 咱们在delete一个指针以前不须要检测指针是否为空,由于delete空指针也是没问题的。spa

五、 咱们在引用一个未知的指针时,要判断一下这个指针是否为空。指针

六、 delete和delete[]都会释放掉其所指向的数组元素内的全部空间,可是delete[]会对每一个对象都调用析构函数,delete只会调用第一个元素的析构函数。对基本类型由于没有析构函数因此delete和delete[]没什么关系。其实若是类中没有利用new分配空间,在析构函数中不须要delete别的资源的话也是不会内存泄露的,但若是析构函数中须要delete别的资源而这个用delete而不用delete[]就只释放了第一个元素的资源,剩下元素的其余资源并不会被释放。对象

七、 有了malloc/free为何还要new/delete ?内存

1):malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们均可用于申请动态内存和释放内存。
2):对于非内部数据类型的对象而言,光用maloc/free没法知足动态对象的要求。对象在建立的同时要自动执行构造函数,对象在消亡以前要自动执行析构函数。因为malloc/free是库函数而不是运算符,不在编译器控制权限以内,不可以把执行构造函数和析构函数的任务强加于malloc/free。
3):所以C++语言须要一个能完成动态内存分配和初始化工做的运算符new,以及一个能完成清理与释放内存工做的运算符delete。注意new/delete不是库函数。这是由于new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在建立动态对象的同时完成了初始化工做,这里编译器调用的是对象的无参构造函数。资源

相关文章
相关标签/搜索