4-数组、指针与字符串1.4-动态内存分配

这种在程序运行过程中申请和释放的存储单元也称为堆对象,申请和释放过程过程一般称为建立和删除。

1、new运算和delete运算

运算符new的功能是动态分配内存,或者称为动态创建堆对象,语法形式为:

new 类型名T(初值列表);//用于申请分配存放T类型数据的内存空间,并使用初值列表中给出的值进行初始化。

如果建立的对象是一个基本类型变量,初始化过程就是赋值,如:

int *point;

point =new int(2);

动态分配了用于存放int类型数据的内存空间,并将初值2存入该空间中,然后将首地址赋给指针point。

如果建立的对象时某一个类的实例对象,就是要根据实际情况调用该类的构造函数

运算符delete用来删除由new建立的对象,释放指针所指向的内存空间。格式为:

delete 指针名;

如果删除的是对象,该对象的析构函数将被调用。对于用new建立的对象,只能使用delete进行一次删除操作,如果对同一内存空间多次使用delete进行删除将会导致运行错误。

#include<iostream>
using namespace std;
class Point
{
public:
Point()
{X=Y=0;cout<<"Default Constructor called."<<endl;}
Point(int xx,int yy){X=xx;Y=yy;cout<<"Constructor called."<<endl;}//构造函数
~Point()
{cout<<"Destructor called."<<endl;}
int GetX(){return X;}
int GetY(){return Y;}
void Move(int x,int y)
{X=x;Y=y;}

private:
int X,Y;
};

int main()
{
cout<<"Step One:"<<endl;
Point *Ptrl=new Point;//动态创建对象,没有给出初值,因此调用默认的构造函数
delete Ptrl;//删除对象,自动调用析构函数
cout<<"Step Two:"<<endl;
Ptrl=new Point(1,2);//动态创建对象,并给出初值,因此调用有形参的构造函数
delete Ptrl;//删除对象,自动调用析构函数
getchar();
}

使用运算符new也可以创建数组类型的对象,这时,需要给出数组的结构说明,用new运算符动态创建一维数组的语法形式为:

new 类型名T{下标表达式}

其中下标表达式之处数组元素的个数,动态为数组分配内存时不能指定数组元素的初值。注意,如果是用new建立的数组,用delete删除时在指针名前面要加"[]",如

#include<iostream>

using namespace std;

class Point

{

  //类的定义

};

int main()

{

  Point *Ptr=new Point[2];//创建对象数组

  Ptr[0].Move(5,10);//通过指针访问数组元素的成员

  Ptr[1].Move(15,20);//通过指针访问数组元素的成员

  cout<<"Deleting ..."<<endl;

  delete[] Ptr;//删除整个对象数组

}

利用动态内存分配操作实现了数组的动态创建,使得数组元素的个数可以根据运行时的需要而确定。但是建立和删除数组的过程使得程序略显繁琐,更好的方法是将数组的建立和删除过程封装起来,形成一个动态数组类

eg:

#include<iostream>

using namespace std;

class Point

{

  //类的定义

};

class ArrayOfPoints

{

  public:

  ArrayOfPoints(int n)

  {numberOfPoints=n;points=new Point[n];}

  ~ArrayOfPoints()

  {cout<<"Deleting..."<<endl;numberOfPoints=0;delete[] points;}

  Point& Element(int n)

  {return points[n];}

  private:

  Point *points;

  int numberOfPoints;

};

int main()

{

  int numbers;

  cout<<"Please enter the number of points:";

  cin>>number;

  ArrayOfPoints points(number);//创建对象数组

  points.Element(0).Move(5,10);//通过指针访问数组元素的成员

  points.Element(1).Move(15,20);//同上

}

在main函数中,只是建立一个ArrayOfPoints类的对象,对象的初始化参数number指定了数组元素的个数,创建和删除对象数组的过程都由ArrayOfPoints类的构造函数和析构函数完成。

用new操作也可以创建多维数组,形式如下:

new 类型名T[下标表达式1][下标表达式2]...;

eg:float *fp;

fp=new float[10][25][10];

会产生错误,因为这里new操作产生的是指向一个25x10的二维float类型数组的指针。应该改为:

float (*cp)[25][10];

cp =new float[10][25][10];

2、动态内存分配与释放函数

a、动态存储分配函数

原型:void *malloc(size);

参数:size是欲分配的字节数

返回值:成功,则返回void型智者;失败,则返回空指针。

头文件:<stdlib.h>和<malloc.h>

b、动态内存释放函数

原型:void free(void *memblock);

参数:memblock是指针,指向需要释放的内存。

返回值:无

头文件:<stdlib.h>和<malloc.h>

 

转载于:https://www.cnblogs.com/gary-guo/p/6230032.html

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

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

相关文章

参数变化_风机盘管参数变化对性能造成的影响

参数变化对性能造成的影响:1、风机盘管风量一定&#xff0c;供水温度一定&#xff0c;供水量变化时&#xff0c;制冷量随供水量的变化而变化&#xff0c;根据部分风机盘管产品性能统计&#xff0c;当供水温度为7℃&#xff0c;供水量减少到80%时&#xff0c;制冷量为原来的92%左…

Android基础总结(八)Service

服务两种启动方式&#xff08;掌握&#xff09; startService 开始服务&#xff0c;会使进程变成为服务进程启动服务的activity和服务不再有一毛钱关系bindService 绑定服务不会使进程变成服务进程绑定服务&#xff0c;是activity与服务建立连接&#xff0c;如果activity销毁了…

疲劳驾驶监测方案_【Nano Energy】TENG用于驾驶员驾驶状态监测

01研究背景研究表明&#xff0c;驾驶员的疲劳和分心会降低其感知能力和对汽车控制的决策能力。大约20%车祸和30%致命车祸的原因是由于驾驶员疲劳和注意力不集中造成的&#xff0c;同时也会导致单车撞击事故和大型车撞击事故发生率上升到50%。因此通过建立智能交通系统(ITS)来提…

升级Struts2.5后使用DMI动态方法调用遇到问题

转自&#xff1a;http://www.lvhongqiang.com/blog429.html 问题&#xff1a; 升级Struts2.5后使用DMI动态方法调用报错&#xff0c;method 找不到。 源码&#xff1a; struts.xml <action name"json_*_*" class"{1}Action" method"{2}"> …

后缀用什么打开_茅台酒瓶口的珠子有什么用,取出来能多倒一杯酒?打开方法教给你...

茅台酒瓶口的珠子有什么用&#xff0c;取出来能多倒一杯酒&#xff1f;打开方法教给你。喝过茅台酒的人都知道&#xff0c;在茅台酒的瓶口处有一个特别的设计&#xff0c;就是里面放里2个珠子&#xff0c;摇晃的时候能听到声音。那么茅台酒的瓶口为什么要放2颗珠子&#xff1f;…

2 django系列之django分页与templatetags

preface 当页面出现的条目多的时候&#xff0c;我们就需要使用分页功能了。Django作为一个知名的web框架&#xff0c;自然也提供了分页功能&#xff0c;下面说说它。 Python-shell 练练手 在python下入手 先创建一个操作对象 >>> hehe [ljf,richer,wang,1,2,3] >&…

计算传递函数乘法_软件开发教程:计算机科学最重要的32个算法

软件开发的根本在于解决各种业务功能需要&#xff0c;实现数字化和自动化&#xff0c;而算法(Algorithm)是对解决方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令。算法代表着用系统的方法描述解决问题的策略机制。在计算机科学领域有32个重要的算法需要研究。简…

Rails下cloud datastore的使用

Rails下cloud datastore的使用 背景 部门有一个项目要用Ruby做 WebAPI&#xff0c;DB使用关系型数据库Cloud Sql和非关系型数据库Cloud Datastore 。 还不了解Ruby On Rails和CloudDatastore的请参考下面的链接。 http://guides.ruby-china.org/ https://thinkit.co.jp/story/2…

hanlp 词频统计_10.HanLP实现k均值--文本聚类

AI人工智能10.HanLP实现k均值--文本聚类10. 文本聚类正所谓物以类聚&#xff0c;人以群分。人们在获取数据时需要整理&#xff0c;将相似的数据归档到一起&#xff0c;自动发现大量样本之间的相似性&#xff0c;这种根据相似性归档的任务称为聚类。10.1 概述聚类聚类(cluster a…

追本溯源 —— 汉语词汇含义的演化

1. 比喻义 枷&#xff1a;旧时一种套在脖子上的刑具&#xff08;想象水浒传里的林冲&#xff0c;还要把手塞进去&#xff09;&#xff1a;&#xff5e;锁&#xff08;旧时的两种刑具&#xff0c;喻束缚&#xff09;。转载于:https://www.cnblogs.com/mtcnn/p/9422411.html

view 冒号作用 组件中属性_如何解析名称中带有冒号的JSON?安卓/ Java...

例如&#xff1a;{“ primary&#xff1a;title”&#xff1a;“小红帽”}由于主要名称和标题之间存在冒号,因此我在Java(Android)中的解析器总是卡住.我可以轻松解析其他任何内容,我只需要帮助.public class MainActivity extends Activity {/** Called when the activity is …

【工具与解决方案】从做项目中积累学习

【Java-Swing】 1.http://java-mans.iteye.com/blog/1650786 JAVA&#xff0d;SWT如何在Jtable单元格中加入复选框Jcheckbox,Jbutton,JcomboBox 2.环境搭建 http://blog.csdn.net/ghuil/article/details/40652645 http://www.cnblogs.com/yaowukonga/archive/2013/02/28/29…

目标检测排行榜_3D领域重大突破!大华股份人工智能取得KITTI Object 3D车辆检测排行榜第一名...

[导读]近日&#xff0c;大华股份基于深度学习技术研发的3D目标检测技术&#xff0c;刷新了The KITTI Vision Benchmark Suite中3D车辆类目检测任务(3D Object Detection Evaluation)排行榜&#xff0c;取得了3D车辆类目检测第一名&#xff0c;这标志着大华股份的人工智能技术在…

MYSQL-5.5二进制包安装

groupadd mysql 添加用户组 useradd mysql -s /sbin/nologin -g mysql -M 添加用户 mv mysql-5.5.54-linux2.6-x86_64.tar.gz /home/ye/software/ 下载软件到软件包 cd /home/ye/software/ tar -xf mysql-5.5.54-linux2.6-x86_64.tar.gz #解压mysql软件 cd mysql-5.5.54-lin…

mysql aes encrypt_mysql加密函数aes_encrypt()和aes_decrypt()使用教程

aes_encrypt()和aes_decrypt()在mysql中是进行加密了&#xff0c;我们今天一起来和各位看看关于mysql中aes_encrypt()和aes_decrypt()函数的使用例子&#xff0e;如果你需要对mysql某些字段进行加解密的话,使用mysql的加解密函数可能比程序中处理更方便.mysql-encrypt-funcs.pn…

为什么选择mysql_为什么选择MySQL数据库即MySQL优势介绍

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

窗口尺寸,文档高,元素宽高的获取方式

一.元素宽高&#xff1a; window.onload function() { var oDiv document.getElementById(div1); /* width height style.width : 样式宽 clientWidth : 可视区宽 offsetWidth : 占位宽 */ alert( oDiv.style.width ); /…

Mariadb使用总结

一、pt-quert-digest使用1、安装perl程序12yum -y install perl-Time-HiResyum -y install perl-DBI二、登录授权123456789service mysqld stop/usr/bin/mysqld_safe --skip-grant-tables &use mysql;update user set passwordpassword(yournewpasswordhere) where userroo…

python执行到input后执行下一程序_Python基础知识储备,如何开关一个while循环

一、什么是循环循环语句就是在某种条件下&#xff0c;一遍一遍重复的执行某个动作。如&#xff1a;从1加到100&#xff0c;重复执行加法的动作&#xff0c;就需要用到循环。二、循环的三要素虽然循环是反复的执行某个动作&#xff0c;但是循环也会停止的&#xff0c;没有停止的…

Intellij idea添加单元测试工具

1.idea 版本是14.0.0 &#xff0c;默认带有Junit&#xff0c;但是不能自动生成单元测试&#xff0c;需要下载JunitGererator2.0插件 2.Settings -Plugins&#xff0c;下载 JunitGenerator V2.0插件 &#xff0c;我的是已经下载好的。下载后提示需要重启 3.下载后 点击需要测试的…