New/Delete
new和delete是函数吗
不是。和 sizeof 类似,new 和 delete 也不是函数,它们都是 C++ 定义的关键字,通过特定的语法可以组成表达式。和 sizeof 不同的是,sizeof 在编译时候就可以确定其返回值,new 和 delete 背后的机制则比较复杂。
new和delete的基本用法
new命令会在堆区域分配创建一个对象,而后返回此对象的地址。
delete命令会释放指针指向的对象所占用的内存空间,而此后指针指向的地址是没有意义的,为了避免错误,一般来说,应该在delete后立即将指针置为NULL。
|
|
注意:delete命令只能用来释放由 new获得的指针,而且 new得到的指针必须通过 delete释放掉,否则会有内存泄漏的问题。
动态创建对象的默认初始化
用 new创建的对象的默认初始化规则与局部变量的初始化规则相同,即:对内置类型,不进行初始化;对于类类型变量,用默认构造函数进行初始化。
举个例子:
|
|
程序运行结果为:
*pi=-842150451
MyClass-默认构造函数
可见对pi 没有进行初始化,对pClass调用了MyClass类的默认构造函数。所以对于内置类型,用new申请变量时必须进行初始化,否则其指向的值是未知的。
new [] 和 delete []
为什么 new/delete 、new []/delete[] 要配对使用?
new创建类对象与不new区别
下面是自己总结的一些关于new创建类对象特点:
- new创建类对象需要指针接收,一处初始化,多处使用
- new创建类对象使用完需delete销毁
- new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
- new对象指针用途广泛,比如作为函数返回值、函数参数等
- 频繁调用场合并不适合new,就像new申请和释放内存一样
和malloc以及free的区别
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由malloc/free是库函数而不是
运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free
Reference
-
No backlinks found.