new和delete是函数吗

不是。和 sizeof 类似,new 和 delete 也不是函数,它们都是 C++ 定义的关键字,通过特定的语法可以组成表达式。和 sizeof 不同的是,sizeof 在编译时候就可以确定其返回值,new 和 delete 背后的机制则比较复杂。

new和delete的基本用法

new命令会在堆区域分配创建一个对象,而后返回此对象的地址。 delete命令会释放指针指向的对象所占用的内存空间,而此后指针指向的地址是没有意义的,为了避免错误,一般来说,应该在delete后立即将指针置为NULL。

1
2
3
4
5
int *pi=new int;    //动态创建对象
 //....  
  
delete pi;    //删除动态创建对象  
pi=NULL;    //将指针置为NULL  

注意:delete命令只能用来释放由 new获得的指针,而且 new得到的指针必须通过 delete释放掉,否则会有内存泄漏的问题。

动态创建对象的默认初始化

new创建的对象的默认初始化规则与局部变量的初始化规则相同,即:对内置类型,不进行初始化;对于类类型变量,用默认构造函数进行初始化。

举个例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>  
  
using namespace std;  
  
class MyClass    //类定义  
{  
public:  
 MyClass();  
};  
  
MyClass::MyClass()    //默认构造函数  
{  
 cout<<"MyClass-默认构造函数"<<endl;  
}  
  
int main()  
{  
 int *pi=new int;  
 cout<<"*pi="<<*pi<<endl;  
 MyClass *pClass=new MyClass;  
 return 0;  
}  

程序运行结果为:

*pi=-842150451

MyClass-默认构造函数

可见对pi 没有进行初始化,对pClass调用了MyClass类的默认构造函数。所以对于内置类型,用new申请变量时必须进行初始化,否则其指向的值是未知的。

enter image description here
enter image description here

enter image description here
enter image description here

new [] 和 delete []

enter image description here
enter image description here

enter image description here
enter image description here

为什么 new/delete 、new []/delete[] 要配对使用?

new创建类对象与不new区别

下面是自己总结的一些关于new创建类对象特点:

  • new创建类对象需要指针接收,一处初始化,多处使用
  • new创建类对象使用完需delete销毁
  • new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
  • new对象指针用途广泛,比如作为函数返回值、函数参数等
  • 频繁调用场合并不适合new,就像new申请和释放内存一样

和malloc以及free的区别

对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由malloc/free是库函数而不是

运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free

Reference