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

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

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

  1. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  2. 浅谈C语言动态内存分配及柔性数组

    文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...

  3. C和指针之动态内存分配之编程练习3

    1.问题 编写一个函数,从标准输入读取一个字符串,把字符串复制到动态内存分配的内存中,并返回该字符串的拷贝,这个函数不应该对读入字符串的长度作任何限制!             2.代码实现 #inc ...

  4. 【C语言进阶学习笔记】五、动态内存分配(爆肝吐血力作,强烈建议收藏!!!)

    前言 现代计算机基本都是基于冯诺伊曼结构体系设计出来的,冯诺伊曼结构体系的核心就是"存储程序",将程序(指令集)和数据以同等地位存储在内存中.但是我们的内存空间并不是无限大的,所以 ...

  5. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  6. 动态内存分配与智能指针

    内存分配: 静态存储区: 局部static对象 类的static数据成员 定义在任何函数之外的变量 栈区: 函数内的非static对象 动态内存分配的方式有: new和delete 智能指针(shar ...

  7. 动态内存分配与柔性数组

    什么时动态内存分配 一般我们写程序都是在栈区分配空间,如果我们想根据需求想随时存放随时释放数据,堆区可以实现根据需求想系统申请所需大小的空间. 建立内存的动态分配 内存的动态分配是通过系统提供的函数来 ...

  8. 【 C 】动态内存分配实用案例(二)之复制字符串

    用动态分配内存制作一个字符串的一份拷贝.注意:调用程序应该负责检查这块内存是否分配成功,这样做允许程序以任何它所希望的方式对错误作出反应. #nclude <stdlib.h> #incl ...

  9. 在c语言中,可以使用动态内存分配技术定义元素个数可变的数组,C语言复制在线考题1精选.doc...

    C语言复制在线考题1精选 窗体顶端 <C语言程序设计208304>综合测试 返回测验列表 大项 1 / 2 - 单项选择题 60.0/ 70.0 分 本大题共35道,每题2分,共计70分, ...

最新文章

  1. 使用OpenCV进行图像全景拼接
  2. 【64QAM同步】基于FPGA/MATLAB的64QAM同步系统的实现
  3. 是否可以改变 宏的值_给女人的建议:当父母不同意你的男朋友,可以尝试六个方法...
  4. C语言操作MYSQL小例子
  5. 如何评价一个产品经理工作做的好坏?
  6. mysql 一个字段走索引吗_mysql数据库--explain(查询表是否走索引)各个字段含义...
  7. 计算机中级职称考试答题卡,2016年软考网络工程师考试填涂答题卡(纸)须知...
  8. 神泣服务器维护公告,《神泣》官方网站—创天互娱
  9. ubuntu 设置静态路由_ubuntu 配置静态路由
  10. 使用最广泛的缓存Redis,升级到6.0后超神了
  11. 经纬财富:开封如何炒现货白银
  12. 一个IT实习生的感悟
  13. 上海居住证续签流程须知
  14. Arnold 渲染设置 - Main - Sampling 采样设置
  15. 在Unity3D中使用泛型(上)
  16. callback 回调函数
  17. YDOOK: ANSYS Maxwell 19 教程11:Maxwell 2D 静电场怎样设置激励源
  18. vscode安装python插件失败_vscode安装python插件
  19. vue封装图片滑块验证+读秒组件
  20. Git 本地误删文件,本地恢复误删文件

热门文章

  1. CAP 原则与 BASE 理论
  2. Java8————Stream API
  3. 临时文件_其实邮箱可能才是最佳的临时文件分享途径
  4. c++ stl 容器 迭代器 stl用法示例
  5. 基于Java springboot+vue+redis前后端分离家具商城平台系统设计和实现
  6. HTML+CSS+JS实现 ❤️动态散花背景❤️
  7. python3.6库参考手册_python3.5.2官方帮助文档参考手册(CHM版)
  8. Java 在指定目录下查找文件
  9. java爬取单张图片
  10. ply补全为立方体_PLY文件格式