zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    python
    在liunx环境下安装python
    解决用navicate远程连接数据库出现1045
    mysql的监控及优化
    mysql基础
    linux基础学习
    Effective c++ 第一章 让自己习惯C++
    读前感
    socket编程:客户端与服务器间的连接以及各函数的用法
    生成任意区间的随机数
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6230032.html
Copyright © 2011-2022 走看看