调用new-delete时,它们都做了两个事情:
(1)分配内存
(2)调用对象的涉及到的构造函数
用new分配内存时有三种形式:
(1)p =new type;
(2)p =new type(x);
(3)p =new type[N];
其中type为数据类型,p为指针变量。new将分配的内存的首地址赋值给指针p。
new会根据type类型自动计算将要分配的内存大小,如果分配成功则返回此块内存的首地址,如果分配失败则返回NULL。返回值跟malloc-free一样,C中malloc-free的用法虽然只有一种形式,在分配内存的时候需要将返回的void类型指针转换为对应的指针类型且需要计算将要分配内存的大小(sizeof)。
第一种形式new只分配内存[内存中是否已经建立好了type对象还木有验证],第二种形式在分配内存的情况下将内存初始化为x,第三种情况形式表示分配具有N个元素的数组。
(1)调用对象涉及的析构函数
(2)释放内存
对应的delete的用法:
(1)用于释放动态分配的单个指针变量
delete p;
(2)用于释放动态分配内存的数组存储区域
delete[]p;
如果针对于C/C++简单的内建数据类型( int,char )那么用malloc-free和用new-delete有一点不同:针对于这些简单的数据类型为其分配的都是一块内存区域(这些数据类型内无构造和解析函数),只是new在分配的同时还可以初始化一番内存和内存单元里面会创建此对象;它们释放内存的形式也是通过内存的首地址。但是如果针对有构造函数和析构函数的C++对象时,malloc-free就会显现出许多弊端。
malloc申请内存空间时只是申请了一块还未被初始化的内存,并将此块内存的首地址返回,在使用free释放内存只是会将malloc所赋值指针所指向的内存块释放掉,不会让内存中的对象调用其析构函数。
用new时,会在所申请的内存中的每单元内存(每个元素所占内存)中创建好每个对象;delete会使内存中的对象调用其析构函数(释放对象本身再建的资源)。
所以,malloc-free适合在C语言中实现内存的动态分配,而在C++的世界里,new-delete才具有对象构造-析构这个机制。在使用的时候,malloc-free、new-delete一定要成对出现且不要出现配对错误的情况。
new-delete形式保持统一包含两个方面:
(1)如果new只是分配了一块内存给单一的指针,那么释放此块内存时也使用释放单指针的形式
如:
string *pString = new string;
…
deletepString;
(2)如果new用于分配了一个数组,则用delete释放时也要用[]
如:
string *pString = newstring[100];
…
delete []pString;
如果采取delete pSting的形式就是将内存中存储的100个string的首地址删除了,根据delete机制,第一个元素先调用了其析构函数,然后首地址被释放。首地址被释放标志着整块内存都被释放掉而pString后继元素就直接被掀走了,这些后继元素就没有机会调用自己的构造函数来释放自己本身所申请的资源(如果有,如果本身就没有什么用析构函数来释放什么资源的,不加[]的delete法也是可以的)。
而malloc/free不需要有形式保持统一的规则。
C/C++ Note Over。