new和delete

和 sizeof 相似,sizeof不是函数,它是一个操做符,它在编译期就完成了计算,在函数运行期间它已是一个常数值了。数组

int a;
sizeof(int) = 4;
sizeof(a) = 4;
sizeof a ——也是4  不须要括号!
 
此时要注意:
sizeof int——错误!此时int  把sizeof当成int的修饰词;好比  signed int ,  register int 。。。

new 和 delete 也不是函数,它们都是 C++ 定义的关键字,经过特定的语法能够组成表达式。和 sizeof 不一样的是,sizeof 在编译时候就能够肯定其返回值,new 和 delete 背后的机制则比较复杂。函数

 

string *ps = new string("hello world"); 

你就能够看出 new 和 malloc 仍是有点不一样的,malloc 申请完空间以后不会对内存进行必要的初始化,而 new 能够。spa

 

operator new 和 operator delete

这两个实际上是 C++ 语言标准库的库函数,原型分别以下:指针

void *operator new(size_t); //allocate an object void *operator delete(void *); //free an object void *operator new[](size_t); //allocate an array void *operator delete[](void *); //free an array 

后面两个你能够先不看,后面再介绍。前面两个均是 C++ 标准库函数,你可能会以为这是函数吗?请不要怀疑,这就是函数!C++ Primer 一书上说这不是重载 new 和 delete 表达式(如 operator= 就是重载 = 操做符),由于 new 和 delete 是不容许重载的。但我还没搞清楚为何要用 operator new 和 operator delete 来命名,比较费解。咱们只要知道它们的意思就能够了,这两个函数和 C 语言中的 malloc 和 free 函数有点像了,都是用来申请和释放内存的,而且 operator new 申请内存以后不对内存进行初始化,直接返回申请内存的指针。code

 

如何申请和释放一个数组?

string *psa = new string[10]; //array of 10 empty strings int *pia = new int[10]; 
上面在申请一个数组时都用到了  这个表达式来完成,按照咱们上面讲到的 new 和 delete 知识,第一个数组是 string 类型,分配了保存对象的内存空间以后,将调用 string 类型的默认构造函数依次初始化数组中每一个元素;第二个是申请具备内置类型的数组,分配了存储 10 个 int 对象的内存空间,但并无初始化。
new []
delete [] psa; delete [] pia;
都用到  表达式,注意这地方的 [] 通常状况下不能漏掉!咱们也能够想象这两个语句分别干了什么:第一个对 10 个 string 对象分别调用析构函数,而后再释放掉为对象分配的全部内存空间;第二个由于是内置类型不存在析构函数,直接释放为 10 个 int 型分配的全部内存空间。delete []
相关文章
相关标签/搜索