c++中new的总结(动态管理,malloc存在的问题,malloc与new的区别)

c中使用malloc出现的问题

  1. 程序员必须确定对象的长度
  2. malloc 返回一个(void *)指针 ,c++不允许将(void*) 赋值给其它指针,必须强转
  3. malloc可能申请内存失败,所以必须判断返回值来保存内存分配成功
  4. 用户在使用对象之前必须记住对他初始化,构造函数不能显示调用初始化(构造函数是由编译器调用的),用户有可能忘记调用初始化函数

c的动态内存分配函数太复杂,容易令人混淆,是不可接受的,c++中我们推荐使用运算符new和delete

new运算符和delete运算符

  1. Person *p=new Person会返回一个Person

  2. 默认调用析构函数,开辟空间,返回不是void*,不需要强制转换

  3. delete释放

  4. new对象用void *取接受,释放不了对象

  5. new出来的是数组,如何释放 ? delete[]

  6. new出来的是数组,肯定会调用默认构造

         #include<iostream>using namespace std;class Person{public:Person(){cout << "默认构造函数调用" << endl;}Person(int a){cout << "有参构造调用" << endl;}~Person(){cout << "析构函数调用" << endl;}};void test01(){//Person p1; //栈区开辟Person *p2 = new Person;//堆区开辟//所有new出来的对象,都会返回该类型的指针//malloc返回void*还要强转//malloc会调用构造吗?不会 new会调用构造//new运算符,malloc是函数//释放堆区域的空间//delete也是运算符,要配合new用,malloc配合free用delete p2;}void test02(){void *p = new Person;//当用void* 接受new出来的指针,会出现释放的问题delete p;//无法释放p}void test03(){//同过new来开辟数组//一定会调用默认构造函数,所以一定要提供默认构造Person *pArray = new Person[10];//Person pArray2[2] = { Person(1), Person(2) };//在栈上开辟数组,可以指定有参构造//释放数组 delete[]必须加上中括号delete []pArray;}int main(){//test01();//test02();test03();system("pause");return 0;}
    

malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:

  1. malloc和free是函数,new和delete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可
  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间 后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理
  7. new/delete比malloc和free的效率稍微低点,因为new/delete的底层封装了malloc/free

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中变量#,@,0,1,2,*,$$,$?的含义

$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数&#xff0c;与位置变量不同&#xff0c;参数可超过9个 $$ 是脚本运行的当前…

Volatile的陷阱

最近写的关于在嵌入式开发中常遇到的关于volatile关键字使用的短文&#xff0c;都是些通用的技术&#xff0c;贴上来share。 对于volatile关键字&#xff0c;大部分的C语言教材都是一笔带过&#xff0c;并没有做太过深入的分析&#xff0c;所以这里简单整理了一些关于volatile的…

c++中静态成员变量和静态成员函数

静态成员变量 在一个类中&#xff0c;若将一个成员变量声明为static,这种成员成为静态成员变量&#xff0c;与一般的数据成员不同&#xff0c;无论建立了多少个对象&#xff0c;都只想有一个静态数据的拷贝&#xff0c;静态成员变量&#xff0c;属于某个类&#xff0c;所有对象…

单列模式(饿汉)

单例模式案例 目的&#xff1a;为了让类中只有一个实例&#xff0c;实例不需要自己释放将 默认构造 和 拷贝构造 私有化内部维护一个 对象的指针私有化唯一指针对外提供getinstance方法来访问这个指针保证类中只能实例化唯一 一个对象 主席案例 #include<iostream>usin…

Makefile札记

Makefile中: ? 的区别 在Makefile中我们经常看到 : ? 这几个赋值运算符&#xff0c;那么他们有什么区别呢&#xff1f;我们来做个简单的实验 新建一个Makefile&#xff0c;内容为&#xff1a; ifdef DEFINE_VRE VRE “Hello World!” else endif ifeq ($(OPT),define) VRE…

c++中this指针基本概念和使用

class Person { public:int m_A;//非静态成员变量&#xff0c;属于对象上void func(/*Person * this*/){}; //非静态成员函数 不属于对象身上static int m_B;//静态成员函数&#xff0c;不属于对象上static void fun2(){};//静态成员函数 &#xff0c;不属于对象身上//double …

通用Makefile实现

Makefile是Linux下程序开发的自动化编译工具&#xff0c;一个好的Makefile应该准确的识别编译目标与源文件的依赖关系&#xff0c;并且有着高效的编译效率&#xff0c;即每次重新make时只需要处理那些修改过的文件即可。Makefile拥有很多复杂的功能&#xff0c;这里不可能也没必…

c++中空指针访问成员函数

如果成员函数没有用到this &#xff0c;那么空指针可以直接访问 如果成员函数用到this 指针&#xff0c;就要注意&#xff0c;要判断是否为空&#xff0c;防止程序崩溃 #include<iostream>using namespace std;class Person{public:void show(){//没有 用到this指针&am…

从0开始python学习-35.allure报告企业定制

目录 1. 搭建allure环境 2. 生成报告 3. logo定制 4. 企业级报告内容或层级定制 5. allure局域网查看 1. 搭建allure环境 1.1 JDK&#xff0c;使用PyCharm 找到pycharm安装目录找到java.exe记下jbr目录的完整路径&#xff0c;eg: C:\Program Files\JetBrains\PyCharm Com…

grep 常用命令

这个--include选项,可以这样使用: grep -rn --include*.c --include*.h re . 可以指定多次, 如果真是上面的这种情况, 其实可以用 grep -rn --include*.[ch] re . 但是, 如果源文件中含有C源代码,上面的方法就不凑效了, 因为[]中只能放一个字符. grep -rn --include*.{cp…

c++中友元函数详解

友元 友元分为&#xff1a;友元函数和友元类 友元提供了一种突破封装的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以友元不宜多 用。 全局函数做友元函数 全局函数写到类中做声明 并且最前面写关键字 friend 友元函数可访问…

Linux时间函数札记

关于gmtime、gmtime_r、localtime、localtime_r 测试环境&#xff1a;vmware 7 Redhat5.5&#xff0c;系统时间使用UTC&#xff0c;时区为上海。 1、函数功能介绍 使用man gmtime或man localtime都可以的得到这几个函数的介绍。原型如下&#xff1a; struct tm *gmtime(const …

c++实现顺序表的相关操作

Myarray.h文件 #pragma once#include<iostream>using namespace std;class MyArray { public:MyArray();//默认构造 默认100容量MyArray(int capacity);MyArray(const MyArray& array);~MyArray();//尾插法void Push_Back(int val);//根据索引获取值int getData(int…

系统架构札记

什么是高内聚、低耦合&#xff1f; 起因&#xff1a;模块独立性指每个模块只完成系统要求的独立子功能&#xff0c;并且与其他模块的联系最少且接口简单&#xff0c;两个定性的度量标准――耦合性和内聚性。 耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一…

c++中运算符重载(加号运算,左移运算,前置后置++运算符,赋值运算,关系运算,函数运算)

运算符重载注意 重载的运算符要易读内置的数据类型的表达式的运算符是不可以改变的不要重载&& 和 | | 运算符&#xff0c;[]和->运算符只能通过成员函数进行重载<<和>>只能通过全局函数配合友元函数进行重载 加号运算符重载 如果想让自定义数据类型 进…

linux fstab解读

fstab这个文件挺有用的。 从左到右&#xff1a; /dev/device mount-point type rules dump fsck 1. /dev/device: 不用说了吧&#xff1f;例如&#xff0c;/dev/hda1为M$-Win9x下的c:盘。 2. mount-point: 挂载点。例如&#xff0c;把/dev/hda1挂到/mnt/mywinc下。 3. type: ex…

c++实现字符串类的封装

MyString.h文件 #define _CRT_SECURE_NO_WARNINGS#pragma once#include<iostream>#include<string>using namespace std;class MyString{friend ostream & operator<<(ostream & cout, MyString & str);friend istream & operator>>(…

c++中的继承--1(引出,继承方式,继承的对象模型)

继承的引出 概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特 性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构…

Makefile经典教程(掌握这些足够)

makefile很重要 什么是makefile&#xff1f;或许很多Winodws的程序员都不知道这个东西&#xff0c;因为那些Windows的IDE都为你做了这个工作&#xff0c;但我觉得要作一个好的和professional的程序员&#xff0c;makefile还是要懂。这就好像现在有这么多的HTML的编辑器&#xf…

c++中的继承--2(继承中的析构函数和构造函数,继承中同名成员,继承中静态成员)

继承中的构造函数和析构函数 继承中的构造和析构顺序 子类创建对象时&#xff0c;先调用父类的构造&#xff0c;然后调用自身构造析构顺序与构造顺序相反子类不会继承父类的构造函数和析构函数如果父类中没有合适默认构造&#xff0c;那么子类可以利用初始化列表的方式显示的…