在开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数mallocfree来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符newdelete来取代mallocfree函数。

在C++中因为newdelete是运算符,不是函数,因此执行效率高。

虽然为了与C语言兼容,C++仍保留mallocfree函数,建议不用mallocfree函数,而用newdelete运算符。

new int; // 开辟⼀个存放整数的存储空间,返回⼀个指向该存储空间的地址(即指针) new int(100); // 开辟⼀个存放整数的空间,并指定该整数的初值为100,返回⼀个指向该存储空间的地址     new char[10]; // 开辟⼀个存放字符数组(包括10个元素)的空间,返回⾸元素的地址     new int[5][4];  // 开辟⼀个存放⼆维整型数组(⼤⼩为5*4)的空间,返回⾸元素的地址      float *p = new float(3.14159); // 开辟⼀个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p
#include <iostream>
#include <cstdlib>using namespace std;class Test{public:Test(){m_a = 0;m_b = 0;cout << "0,0 构造" << endl;}Test(int a, int b){m_a = a;m_b = b;cout << "a = " << m_a << ", b = " << m_b << "构造 " << endl;}void setA(int a){m_a = a;}void setB(int b){m_b = b;}void printT(){cout << "a = " << m_a << ", b = " << m_b << endl;}~Test(){cout << "a = " << m_a << ", b = " << m_b << "析构 " << endl;}private:int m_a;int m_b;
};//C语言中
void test1(){int* p = (int*)malloc(sizeof(int));*p = 10;cout << *p << endl;if (p != NULL) {free(p);//delete p; //delete 可以释放malloc的开辟的内存}int* array_p = (int*)malloc(sizeof(int) * 10);for (int i = 0; i < 10; i++) {array_p[i] = i + 10;}for (int i = 0; i < 10; i++) {cout << array_p[i] << endl;}if (array_p != NULL) {free(array_p);}cout << " --------  " << endl;Test* tp = (Test*)malloc(sizeof(Test)); //不会调用对象的构造函数//p(10, 20);tp->setA(10);tp->setB(20); //malloc出来的对象指针,只能够通过成员函数来进行初始化tp->printT();if (tp != NULL) {free(tp); //不会调用对象的析构}
}//malloc 和free 在对于普通变量是可以混合使用的,但是malloc和free是函数,
//new 和delete 是操作符。不是一个函数。//C++中的new delete
void test2(){//new 能够完成所有malloc的需求int* p = new int; //在堆上动态开辟4个字节*p = 10;cout << *p << endl;if (p != NULL) {//delete p; //delete 一个变量free(p); //用new开辟的内存, free也能够释放。}cout << "-----" << endl;int* array_p = new int[10];for (int i = 0; i < 10; i++) {array_p[i] = i + 10;}for (int i = 0; i < 10; i++) {cout << array_p[i] << endl;}if (array_p != NULL) {delete[]   array_p; //delete 一个数组  // delete 数组的时候,虽然[]可以省略,程序运行的时候会自动处理和优化,但是为了方便代码的阅读,在delete数组的时候,需要在delete后面加上 []}cout << "-------" << endl;//Test *tp = new Test(10, 20);//调用了有参数的构造函数 //new 在创建一个对象的时候,会调用对象的构造函数Test* tp = new Test;//调用了无参构造函数tp->printT();if (tp != NULL) {delete tp; //delete在释放一个对象指针的时候,会调用对象析构函数tp = NULL;}
}int main(void){//test1();test2();return 0;
}
  • new 运算符动态分配堆内存
    使用形式:

    指针变量 = new 类型(常量);
    指针变量 = new 类型[表达式];

作用:从堆分配一块“类型”大小的存储空间,返回首地址
其中:“常量”是初始化值,可缺省创建数组对象时,不能为对象指定初始值

  • delete 运算符释放已分配的内存空间
    使用形式:

    delete 指针变量;
    delete[] 指针变量;

其中:“指针变量”必须是一个 new 返回的指针


注:

用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。

总结:

  • malloc不会调用类的构造函数,而new会调用类的构造函数
  • free不会调用类的析构函数,而delete会调用类的析构函数

C++ 对象动态建⽴和释放 new 和 delete相关推荐

  1. c++对象的动态建立和释放

    c++面向对象模型初探 new和delete基本语法 类对象的动态建立和释放 编程实践 new和delete基本语法 1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入 ...

  2. C++之对象的动态建立和释放

    new和delete的用法: 1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了 ...

  3. C++类对象的创建与释放过程

    C++类对象的创建与释放过程 类的定义与实例化 类对象的创建方法 类对象的创建过程 类对象的释放过程 析构函数 缺省析构函数 类的定义与实例化 类对象的创建方法 1.在栈上创建 类名 对象; // 无 ...

  4. 栈上对象的内存自动释放

    1.栈上对象的内存自动释放 当栈上的对象生命周期结束时,会自动的调用对象的析构函数,并释放内存. 如果内存中有成员对象,继续调用成员对象的析构函数. class CC { public:CC() {} ...

  5. 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

    文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...

  6. python创建变量_Python每天一分钟:给类对象动态新增/删除成员变量和方法(函数)...

    一般类对象新增变量或方法的过程 在面向对象(OOP)的编程方法中,如果需要给实例化的类对象新增方法或者属性,一般都是在class类的定义中新增内容,然后才能用类对象来调用新增的方法或变量.如在C++中 ...

  7. python类的成员函数_Python为类对象动态添加成员函数

    Python: 为对象动态添加函数 , 且函数定义 来自一个 str 在 Python 中 , 通常情况下 , 你只能为对象添加一个已经写好的方法 需求 : 传入一个 str 类型的变量 , 其值是一 ...

  8. highcharts ajax 数据格式,Highcharts ajax获取json对象动态生成报表生成 .

    最近做个项目,项目经理想做一个统计报表,在网上查看些资料就选用Highchars 这里和大家分享下使用心得. 重点说明此代码是针对一个报表显示多个项对比显示. 直接贴代码:web端 $(documen ...

  9. 教程-TObjectList.Clear、TStringList.Clear方法对象有没有被释放

    相关资料: http://www.cnblogs.com/rogge7/p/4631796.html delphi TStringList通过AddObject方法添加对象. object里存的只是指 ...

最新文章

  1. c++中的数组和指针,引用
  2. Mac终端Terminal使用
  3. python多线程和多进程使用
  4. php 循环多条件,怎么循环带条件的数组
  5. 第一次失效_神兵小将:净化之力失效地魔兵兽,全靠特殊办法,铁心方式真霸气...
  6. 基于ZigBee 自组网模块的路灯控制网络
  7. android驱动代码,GitHub - rumengsuifeng/AndroidDrivers: Android驱动的代码
  8. LeetCode 2094. 找出 3 位偶数
  9. 计算机一级win7操作题,计算机等级考试一级WIN7操作题.docx
  10. 天锐绿盾技术大讲堂:终端出现红色“+”
  11. excel多元线性拟合_使用Excel数据分析工具进行多元回归分析的方法
  12. 简易的JavaScript文字跟随鼠标移动特效
  13. cisco配置和ios备份
  14. CorelDRAW苹果水晶球详细制作
  15. 尾部关性尾部风险平价和圣杯分布
  16. Postgresql通过docker进行高可用部署 pgpool-II
  17. linux grub2 分辨率,如何安全地更改grub2屏幕分辨率?
  18. 龙场悟道,王阳明悟到了什么?
  19. [含论文+源码等]SSM网上水果生鲜超市商城|电商系统
  20. mysql front 打开sql_使用SQL-Front启动MySQL8.0报错

热门文章

  1. Selenium IDE安装
  2. 转: C语言中位运算符异或“∧”的作用
  3. 大端和小端,字节对齐
  4. Oracle中的单值函数
  5. Exchange日常管理之二十一:管理邮件归档
  6. Redhat Enterprise linux 5 的安装
  7. dom操作表格示例(dom创建表格)
  8. 给gridview动态生成radiobutton添加OnCheckedChanged事件
  9. 嵌入式Linux之我行——ARM MMU工作原理剖析
  10. 手工编译Android程序