1、C和C++动态分配内存区别:

C语言中是利用库函数malloc和free来分配和撤销内存空间的。

          C++提供了较简便而功能较强的运算符new和delete来取代 malloc和free函数。

new和delete是运算符,不是函数,因此执行效率高。

2、new和delete的用法

<1>用法示例:

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

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

<2>用法总结:

new运算符动态分配堆内存

使用形式: 指针变量=new 类型(常量);

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

作用:从堆分配一块类型大小的存储空间,返回首地址

其中:‘常量’是初始化值,可以省略。创建数组对象时,不能为对象指定初始值。

delete运算符释放已经分配的内存空间

使用形式:delete 指针变量;

delete [] 指针变量;

其中 ‘指针变量’必须是一个new返回的指针

3、new和malloc区别

malloc不会调用类的构造函数,而new会调用类的构造函数

Free不会调用类的析构函数,而delete会调用类的析构函数

#if 1
#include<iostream>
#include<stdio.h>
using namespace std;
//1
//malloc free 是函数,标准库 stdlib.h
//new malloc是运算符 没有进栈出栈等操作
//2
//new 在堆上初始化对象时,会触发对象的构造函数 malloc不能
//delete 可以触发对象的析构函数 free不能void c_test01() {int* p = (int *)malloc(sizeof(int));if (p != NULL)*p = 2;if (p != NULL) {free(p);//等价delete p;p = NULL;}int *array_p = (int *)malloc(sizeof(int) * 10);if (array_p != NULL) {for (int i = 0; i < 10; i++){array_p[i] = i;}}for (int i = 0; i < 10; i++){printf("%d  ", array_p[i]);}cout << endl;if (array_p != NULL) {free(array_p);array_p = NULL;}
}void cpp_test01() {int *p = new int;if (p != NULL)*p = 2;if (p != NULL) {delete p;//等价free(p);p = NULL;}int *array = new int[10];  //意思是开辟一个4*10字节空间//int *array = new int(10); 意思是开辟一个4字节空间,赋值为10if (array != NULL) {for (int i = 0; i < 10; i++){array[i] = i;}}for (int i = 0; i < 10; i++){printf("%d  ", array[i]);}if (array != NULL) {delete[] array;  array = NULL;}
}
class Test
{
public:Test(){cout << "Test()" << endl;m_a = 0;m_b = 0;}Test(int a, int b){cout << "Test(int, int)" << endl;m_a = a;m_b = b;}void printT(){cout << "printT:" << m_a << "," << m_b << endl;}~Test(){cout << "~Test()" << endl;}
private:int m_a;int m_b;
};
void c_test02() {Test *tp = (Test *)malloc(sizeof(Test));tp->printT();if (tp != NULL) {free(tp);tp = NULL;}
}void cpp_test02() {Test *tp = new Test; //等价于Test *tp = new Test();//Test *tp = new Test(10, 20);  //触发有参构造tp->printT();if (tp != NULL) {delete tp;tp = NULL;}
}
void test01() {c_test01();cout << "----------------" << endl;cpp_test01();
}
/*
0  1  2  3  4  5  6  7  8  9
----------------
0  1  2  3  4  5  6  7  8  9
*/
void test02() {c_test02();cout << "----------------" << endl;cpp_test02();
}
/*
printT:-842150451,-842150451
----------------
Test()
printT:0,0
~Test()
*/
int main() {test01();//test02();
}#endif

C++基础06-类与对象之new和malloc相关推荐

  1. JAVA基础七 类和对象

    文章目录 JAVA基础七 类和对象 01 引用 02 继承 03 方法重载 04 构造方法 05 this 06 传参 07 包 08 访问修饰符 09 类属性 10 类方法 11 属性初始化 12 ...

  2. JAVA基础––从类和对象开始

    JAVA基础--从类和对象开始 一.概念 1.面向对象中类和对象的概念 对象:对象是具有状态和行为的实体,例如某个具体的学生,或者是王者荣耀里的英雄,可以是物理实体,也可以是逻辑实体. 类:类是一组具 ...

  3. Java_面向对象基础(类、对象、方法和构造函数)

    Java的面向对象基础(类.对象.方法和构造函数) 面向对象的基本概念 面向对象的设计思想 什么是类 什么是对象 类的定义 设计面向对象的例子 步骤一:设计动物这个类 步骤二:创建具体的动物 步骤三: ...

  4. 【C++基础】类和对象——友元

    [C++基础]类和对象--友元 友元的概念 在C++中,不能被外部访问的私有属性,通过友元可以访问. 友元的关键字:friend 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 一.全局函数 ...

  5. java基础(类与对象、集合)

    java基础(类与对象.集合) 类与对象 类与对象中的栈和堆 构造方法 this关键字 面向对象三大特性 封装性(private) 继承性(extends) 方法重写(@override) 多态性 向 ...

  6. 刻意练习:Python基础 -- Task10. 类与对象

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

  7. 06 类与对象、封装、构造方法

    更多文章请见:黑马Java基础笔记大纲 第1章 面向对象思想 1.1 面向对象思想概述   Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使 ...

  8. 基础01类与对象、封装、构造方法

    面向对象思想: 面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节. 面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿 ...

  9. JAVA面向对象编程学习 (1)语法基础与类与对象

    读入函数 Scanner in=new Scanner(System.in);System.out.println(in.nextLine()); 意思是先new一个Scanner类的对象叫in,然后 ...

  10. Python基础78 - 类和对象魔法方法

    Python的类和对象 类比介绍 要搞懂类和对象,可以以类比到实际生活经验帮助自身充分了解,例如建房子. 类(class):相当于施工图纸(blueprint) 对象(object):房子(已建成的) ...

最新文章

  1. 微信小程序自定义组件Component的简单使用
  2. 在leangoo里怎么插入泳道,上下移动泳道和删除泳道?
  3. R语言ggplot2可视化多行文本轴标签、轴标签带下标、轴标签数学公式实战
  4. python实现希尔排序
  5. BZOJ-4300 绝世好(蛋疼)题 DP(递推)
  6. 2020年4月数据库流行度排行:MySQL 成事实王者,国产openGauss引期待
  7. 进击的程序媛:从 Google 第一位程序媛到硅谷女王进化史
  8. 限时促销_江北恒一乐优家丨限时优惠大促销
  9. 查询各科成绩前三名的记录
  10. # Linux备份系统并还原到另一块硬盘
  11. ChucK初步(11)
  12. CEF 对CRX的支持程度
  13. 代码随想录第八天 LeetCode 344、541、剑指Offer 05、151、剑指Offer58 (字符串)
  14. ps基础入门2-图层样式
  15. C#实现汉字转拼音(包括生僻字)
  16. HTML简单的网页制作期末作业【NBA勒布朗詹姆斯篮球明星】HTML+CSS+JavaScript
  17. python: 贝叶斯实现实例
  18. 中英词典 mysql_英汉字典(含音标)csv导入MySQL
  19. 利用python进行Landsat8数据的辐射定标
  20. 北京车展直击:广汽新能源以AI打造“更聪明的陪伴”

热门文章

  1. 远程连接redis遇到的一些错误解决办法JedisConnectionException:java.net.SocketTimeOutException...JedisDataException:D
  2. request.getContextPath()取不到值
  3. 8客户端安装后无法启动_新君越涉水后车辆无法启动
  4. java 异步阻塞_大白话搞懂什么是同步/异步/阻塞/非阻塞
  5. php面向对象异常处理,PHP 错误和异常处理(下)
  6. python tcp服务器并发_python tcp并发服务器
  7. php 标题去重复思想,WordPress网站发布文章时如何防止发布重复标题的文章?
  8. Java本地文件操作
  9. JVM001_类文件结构
  10. php mysql 排名_mysql中如何实现排名