2.16 C++类与new和delete操作符

参考: http://www.weixueyuan.net/view/6347.html

总结:

  

当我们需要为类对象动态分配存储空间时,我们应该使用C++语言提供的new与new[]操作符,而不要使用C语言提供的malloc函数

虽然malloc函数具有分配存储空间的功能,但是这些函数除了分配存储空间外,不会调用类的构造函数。而C++语言提供的new和new[]操作符则不会如此,使用它们为对象分配存储空间的同时,它们也会调用相应的构造函数。

操作符delete和delete[]在释放对象存储空间的同时也会调用析构函数,而free函数则不会调用析构函数。

例1:

#include<iostream>
using namespace std;

class test
{
public:
    test(int i = 1){num = i;cout<<num<<" Constructor"<<endl;}
    ~test(){cout<<num<<" Destructor"<<endl;}
private:
    int num;
};

int main()
{
    test * t0 = new test(0);
    test * t1 = new test[5];
    test * t2 = (test *)malloc(sizeof(test));
    delete t0;
    delete[] t1;
    free(t2);
    return 0;
}

程序运行结果:

0 Constructor
1 Constructor
1 Constructor
1 Constructor
1 Constructor
1 Constructor
0 Destructor
1 Destructor
1 Destructor
1 Destructor
1 Destructor
1 Destructor

从程序运行结果不难看出malloc确实没有调用构造函数,free也没有调用析构函数。在这里可能有人会觉得这没有遵循析构函数调用顺序,其实不是这样的,因为我们在delete t0;的语句的时候就已经要求编译器销毁t0对象了,此时其它对象还处于存活期,因此t0先走一步,调用析构函数。之后再销毁t1所指向的对象数组。

时间: 2024-10-29 19:05:35

2.16 C++类与new和delete操作符的相关文章

重载类的new和delete运算符成员函数

重载类的new和delete运算符成员函数1. 调用new时,先分配内存,后调用构造函数.调用构造函数的行为由编译器控制.2. 调用delete时,先调用析构函数,后释放内存.调用析构函数的行为由编译器控制.重载这两个运算符函数的目的是为了控制内存的分配与释放.如果需要对某个类型频繁地创建和销毁大量的对象,new和delete运算过程可能会耗费过多的时间,并且会产生过多的内存碎片.这两个运算符函数的原型:void * operator new(size_t sz);void operator d

16 元类

面向对象学习目录 1 面向对象介绍 2 类.实例.属性.方法详解 3 面向过程与面向对象进一步比较 4 类与对象 5 属性查找与绑定方法 6 小结 7 继承与派生 8 组合 9 抽象类 10 多态 11 封装 12 绑定方法与非绑定方法 13 内置方法(上) 14 内置方法(中)之描述符 15 内置方法(下) 16 元类 一 知识储备 exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默

2015/9/20 Python基础(16):类和实例

面向对象编程编程的发展已经从简单控制流中按步的指令序列进入到更有组织的方式中,依靠代码块可以形成命名子程序和完成既定的功能.结构化的或过程性编程可以让我们把程序组织成逻辑快,以便重复或重用.创造程序的过程变得更具逻辑性:选出的行为要符合规范,才可以约束创建的数据.迪特尔父子认为结构化编程是“面向行为”的,因为事实上,即使没有任何行为的数据也必须“规定”逻辑性.然而,如果我们能对数据加上动作呢?如果我们所创建和编写的数据片段,是真实生活中实体的模型,内嵌数据体和动作呢?我们通过一系列已定义的接口(

【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化 全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this->b

Javascript的变量与delete操作符

原文:http://charlee.li/javascript-variables-and-delete-operator.html 刚刚看到一篇好文(原文链接), 对Javascript中的delete操作符分析得很透彻.在这里简单地介绍一下内容. 虽然是一个小小的delete操作符,其行为却异常复杂. # Javascript的变量 实际上Javascript中,变量 = 对象属性,这是因为 Javascript 在执行脚本之前 会创建一个Global对象,所有的全局变量都是这个Global

C++之new和delete操作符

在C语言中的动态分配和释放内存的函数是malloc calloc 和 free , 而在C++中要用 new new[] delete delete[] 来申请动态空间和释放空间. 注意:的是new.new[].delete和delete[]是操作符,而非函数:new和delete也是C++的关键字. 操作符new用于动态分配单个空间,而new[]则是用于动态分配一个数组,操作符delete用于释放由new分配的空间,delete[]则用于释放new[]分配的一个数组. 下面是简单的实例代码 u

new 与 delete 操作符

new 和 delete 是C++ 中一对动态申请内存的操作符. new_handler 行为 在std的命名空间中,有这样的代码: namespace std { typedef void (*) () new_handler; new_handler set_new_handler(new_handler p) throw(); } set_new_handler的作用是,允许用户设置当前operator new 失败时的函数,就是new_handler. 它会返回之前的new_handle

[转]深入详解javascript之delete操作符

最近重新温习JS,对delete操作符一直处于一知半解的状态,偶然发现一篇文章,对此作了非常细致深入的解释,看完有茅塞顿开的感觉,不敢独享,大致翻译如下. 原文地址:http://perfectionkills.com/understanding-delete/ P.S. 作者是PrototypeJS的开发组成员之一 ========分割线======== 在开始之前,先让我们看一段代码 Js代码     >>> var sum = function(a, b) {return a + 

c++ new和delete操作符的重载

先分析一条语句: Base *pb= new Base; 这条语句是怎么执行的?首先,这个函数调用标准C++的operator new()函数,然后调用Base的构造函数. 如果我们自定义new时,可以自定义一个new,如 class Base { static void* operator new(size_t size) { } static void operator delete(void *p) { } } 这个Base类里面的new 和delete覆盖掉标准new和标准delete,