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

new和delete的用法:
1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。
注意: new和delete是运算符,不是函数,因此执行效率高。

2)虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。new运算符的例子:
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
3)new和delete运算符使用的一般格式为:
这里写图片描述
用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。

使用类名定义的对象都是静态的,在程序运行过程中,对象所占的空间是不能随时释放的。但有时人们希望在需要用到对象时才建立对象,在不需要用该对象时就撤销它,释放它所占的内存空间以供别的数据使用。这样可提高内存空间的利用率。
C++中,可以用new运算符动态建立对象,用delete运算符撤销对象
比如:
Box *pt; //定义一个指向Box类对象的指针变量pt
pt=new Box; //在pt中存放了新建对象的起始地址
在程序中就可以通过pt访问这个新建的对象。如
cout<height; //输出该对象的height成员
cout<volume( ); //调用该对象的volume函数,计算并输出体积
C++还允许在执行new时,对新建立的对象进行初始化。如
Box *pt=new Box(12,15,18);
这种写法是把上面两个语句(定义指针变量和用new建立新对象)合并为一个语句,并指定初值。这样更精炼。
新对象中的height,width和length分别获得初值12,15,18。调用对象既可以通过对象名,也可以通过指针。
在执行new运算时,如果内存量不足,无法开辟所需的内存空间,目前大多数C++编译系统都使new返回一个0指针值。只要检测返回值是否为0,就可判断分配内存是否成功。
ANSI C++标准提出,在执行new出现故障时,就“抛出”一个“异常”,用户可根据异常进行有关处理。但C++标准仍然允许在出现new故障时返回0指针值。当前,不同的编译系统对new故障的处理方法是不同的。
在不再需要使用由new建立的对象时,可以用delete运算符予以释放。如
delete pt; //释放pt指向的内存空间
这就撤销了pt指向的对象。此后程序不能再使用该对象。
如果用一个指针变量pt先后指向不同的动态对象,应注意指针变量的当前指向,以免删错了对象。在执行delete运算符时,在释放内存空间之前,自动调用析构函数,完成有关善后清理工作。

比如下面的例子:

#include <stdio.h>
#include <stdlib.h>
// malloc 和 free:它们本身不是C语言的语法的一部分,是库函数提供的   函数
// new  和 delete: 它们本身是C++语言的一部分,是 运算符 不是 函数// 创建普通类型变量
int main12_1()
{int *p1 = (int *)malloc(sizeof(int));free(p1);// new + 数据类型int *p2 = new int;*p2 = 10;printf ("*p2 = %d\n", *p2);// 释放 new 出来的空间delete p2;// new 可以在申请空间进行初始化int *p3 = new int(90);printf ("*p3 = %d\n", *p3);delete p3;return 0;
}// 申请数组
int main12_2()
{int *p = (int *)malloc(sizeof(int) * 10);free(p);// 用 new 申请数组 new + 数据类型[size]int *p1 = new int[10];// deleta释放数组 必需要加 [] delete [] p1;return 0;
}class Test12
{
public:Test12(int a, int b){m_a = a;m_b = b;printf ("构造函数\n");}~Test12(){printf ("析构函数\n");}
private:int m_a;int m_b;
};// 动态创建对象
int main12_3()
{Test12 *p = (Test12 *)malloc(sizeof(Test12));free(p);// new 在创建对象的时候会自动构造函数进行对象的构建Test12 *p1 = new Test12(10,20);// delete在进行释放对象的时候会自动调用析构函数进行对象资源的回收delete p1;return 0;
}
}

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

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

相关文章

7.11牛客题(指针)

今天在牛客做错了一道题&#xff0c;在此写下感触题目如下&#xff1a;若有说明:int i, j2,*p&i;,则能完成 ij 赋值功能的语句是&#xff08;B&#xff09;。A i*p; B *p*&j; C i&j; D i**p; 分析&#xff1a;题目中&#xff0c;p指针指向i的地址&#xff0c;A选项…

gpu简介

GPU英文全称Graphic Processing Unit&#xff0c;中文翻译为“图形处理器”。GPU是相对于CPU的一个概念&#xff0c;由于在现代的计算机中&#xff08;特别是家用系统&#xff0c;游戏的发烧友&#xff09;图形的处理变得越来越重要&#xff0c;需要一个专门的图形的核心处理器…

WM有约(五):部署应用程序

WM有约&#xff08;五&#xff09;&#xff1a;部署应用程序 Written by Allen Lee 创建安装包 创建一个新的项目&#xff0c;用来部署Windows Mobile应用程序的项目模板是Other Project Types\Setup and Deployment下的Smart Device CAB Project&#xff1a; 图 1 输入项…

“ 我亦想望,如池鱼悠悠 ... “

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 // 闹钟响了&#xff0c;起床&#xff0c;洗漱完毕&#xff0c;背上电脑出门&#xff0c;到公司打卡 8&#xff1a;20 。 " 我亦想…

C++之静态成员变量和静态成员函数

静态成员变量 关键字 static 可以用于说明一个类的成员&#xff0c; 静态成员提供了一个同类对象的共享机制 把一个类的成员说明为 static 时&#xff0c;这个类无论有多少个对象被创建&#xff0c;这些对象共享这个 static 成员 静态成员局部于类&#xff0c;它不是对象成…

熄火/死火

定义 当反应器正在以显著的反应速率进行操作时&#xff0c;若降低进料入口的温度&#xff0c;使它达到多重态区域的下限&#xff0c;反应速度会突然大幅度下降&#xff0c;反应基本上停止。这个现象称为熄灭。相应的入口温度称为熄灭点。一般指的是汽车熄火。发生原因 有…

H3C 以太网集线器

转载于:https://www.cnblogs.com/fanweisheng/p/11169349.html

解决: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 问题描述&#xff1a;阿里云服务器 磁盘初始化之后用 git-bash ssh rootxx.xx.xx.xx 方式登陆服务器&#xff0c;报错如下。 WARNIN…

C++之面向对象模型

C对象模型可以概括为以下2部分&#xff1a; 1. 语言中直接支持面向对象程序设计的部分&#xff0c;主要涉及如构造函数、析构函数、虚函数、继承&#xff08;单继承、多继承、虚继承&#xff09;、多态等等。 2. 对于各种支持的底层实现机制。 在c语言中&#xff0c;“数据”…

netty接收大文件的方法

参考:http://blog.csdn.net/linuu/article/details/51371595 https://www.jianshu.com/p/a0a51fd79f62 netty默认是只能接收1024个字节&#xff0c;但是我们要传输大文件怎么办&#xff1f; 上代码&#xff1a; 改之后服务端&#xff1a; package server;import io.netty.boots…

制动失灵

定义 制动过程中&#xff0c;由于制动器某些零部件的损坏或发生故障&#xff0c;使运动部件(或运动机械)不能保持停止状态或不能按要求停止运动的现象。制动失灵的原因 制动失灵的关键在于制动系统无法对汽车施加足够的制动力&#xff0c;包括制动液管路液位不足或进入…

webpack 入门,说一下那些不入流的知识点、module.exports{ } 中配置说明

先说说Vue-Cli&#xff08;Vue项目脚手架&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 关于它能干什么&#xff0c;就不再赘述了&#xff0c;我们主要谈谈生成的与webp…

myeclipse2013 jad反编译插件安装

https://blog.csdn.net/zhenshixian88/article/details/26454319 1. 下载插件工具 http://download.csdn.net/detail/zwj_lmss/6697259 2. 里面有两个文件 1).JAD.EXE随便找个地方丢进去(我是随便放哪边的,不过有的人有问题,最后放在了jdk的bin下面.可能他们没有配置环境变量);…

转向失控

定义 转向失控就是方向盘不管用了&#xff0c;打方向盘&#xff0c;但是前轮不动&#xff0c;不受方向盘控制。转向失控的原因 转向失控可能因为车辆过快、酒驾、疲劳、车况不佳、雨雪路滑等&#xff0c;还有转向机构中有零部件脱落、损坏、卡滞时&#xff0c;也会使转向机…

this 的指向问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 this的指向已经是一个老生常谈的问题&#xff0c;每逢面试都要去复习复习&#xff0c;近来巩固js的基础&#xff0c;决心彻底掌握这个知…

C++之全局函数和成员函数的转换

全局函数和成员函数 把全局函数转化成成员函数&#xff0c;通过this指针隐藏左操作数 Test add(Test &t1, Test &t2)》Test add(Test &t2) 把成员函数转换成全局函数&#xff0c;多了一个参数 void printAB()》void printAB(Test *pthis) 函数返回元素和返回引…

HDU 3916 Sequence Decomposition 【贪心】

这道题目的题意就是使用题目中所给的Gate 函数&#xff0c;模拟出输入的结果 当然我们分析的时候可以倒着来&#xff0c;就是拿输入去减 每次Gate 函数都会有一个有效范围 这道题目求的就是&#xff0c;找出一种模拟方法&#xff0c;使得最小的有效范围最大化。 是一道【贪心】…

爆胎

定义 即轮胎爆裂。车辆的缺气(轮胎胎压低于标准胎压)行驶时&#xff0c;随着胎压的下降&#xff0c;轮胎与地面的摩擦成倍增加&#xff0c;胎温急剧升高&#xff0c;轮胎变软&#xff0c;强度急剧下降。这种情况下&#xff0c;如果车辆高速行驶&#xff0c;就可能导致爆胎。…

不要再问我跨域的问题了

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 跨域这两个字就像一块狗皮膏药一样黏在每一个前端开发者身上&#xff0c;无论你在工作上或者面试中无可避免会遇到这个问题。为了应付面…

SSM集合

SSM集成 1. Spring和各个框架的整合 Spring目前是JavaWeb开发中最终的框架&#xff0c;提供一站式服务&#xff0c;可以其他各个框架整合集成 Spring整合方案 1.1. SSH ssh是早期的一种整合方案 Struts2 &#xff1a; Web层框架 Spring &#xff1a; 容器框架 Hibernate &#…