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

Posted LC编程开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++类对象的动态建立和释放相关的知识,希望对你有一定的参考价值。

假设有一个student类,定义如下:

class student{

public: //定义成员变量

    char name[32]; //姓名

    char addr[32]; //家庭地址

    long long number; //电话号码

public: //以下部分是公有部分

    student(char* pn, char* pa, long long n)

    {

        strcpy(name, pn);

        strcpy(addr, pa);

        number = n;

    }

    void print() const

    {

        cout << "name = " << name << endl;

        cout << "addr = " << addr << endl;

        cout << "number = " << number << endl;

    }

};

       那么,我们可以如下定义一个student类对象,如下:

student stud;

此时,定义了一个student类对象,名称是stud。这种方法定义的对象是静态的,在程序运行过程中,对象所占用的空间是不能随时释放的。只有stud对象被系统销毁的的时候,才释放对象。

例如,在一个函数中定义了一个局部对象,只有在该函数结束时,该局部对象才释放。所以,只有对象结束其生命周期的时候,对象才销毁,释放数据。

但是,有时候人们希望在需要用到对象时才建立对象,在不需要用该对象的时候就撤销它,释放它所占用的内存空间以供别的数据使用,这样,可以提高内存空间的利用率。

       所以,C++语言提供了new运算符动态地分配内存,用delete运算符释放这些内存空间。这也适用于对象,可以用new运算符动态建立对象,用delete运算符撤销(销毁)对象。

       如果已经定义了一个student类,可以用下面的方法动态地建立一个对象:

new student;    //student运算符申请一块内存空间

编译系统开辟了一段内存空间,并在此内存空间中存放一个student类对象,同时调用该类的构造函数,以使该对象初始化。

但是,此时用户还无法访问这个对象,因为这个对象既没有对象名,用户也不知道它的地址。这种对象称为无名对象,它确实是存在的,但是它没有名字。

       用new运算符动态地分配内存后,将返回一个指向新对象的指针的值,即所分配的内存空间的起始地址。用户可以获得这个地址,并通过这个地址来访问这个对象。需要定义一个指向本类的对象的指针变量来存放该地址,例如:

student *ps;    //定义一个指向student类对象的指针变量ps;

//ps中存放了新建对象的起始地址;

ps = new student;

       在程序中就可以通过 ps 访问这个新建的student类对象。C++还允许在执行 new 时,对新建立的对象进行初始化,例如:

student *ps;    //定义一个指向student类对象的指针变量ps;

//ps中存放了新建对象的起始地址;

ps = new student("wkf","www.mylinux.vip",13926572996);

       可以看到,定义了指针对象ps之后,调用new关键字定义一个student类对象,同时,调用student类中相应构造函数,初始化一个student对象。然后,把创建的对象地址赋值给ps指针对象。

       下面举例分析使用new, delete来构建和销毁一个对象,程序测试例子如下:

       程序运行结果如下:

       可以看到,调用new来构建一个student类对象,此时,调用student类的构造函数。然后,调用delete来销毁student类对象,就调用student类的析构函数。

       在执行new运算时,如果内存量不足,无法开辟所需的内存空间,目前大多数C++编译系统都使new返回一个0指针值。只要检测返回值是否为0,就可判断分配内存是否成功。注意:很多编译器把“0指针值”定义为空指针NULL。所以,我们可以把NULL看成是空

指针。

       在不再需要使用由new建立的对象时,可以用delete运算符给予释放,如:

delete ps;  //释放ps所指向的内存空间

ps = NULL;  //预防野指针

这就撤销了ps指向的对象。此后程序不能再使用该对象,如果用一个指针变量ps先后指向不同的动态对象,应注意指针变量的当前指向,以免删错了对象。

       在执行delete运算符时,在释放内存空间之前,自动调用析构函数,完成有关善后清理工作。所以,我们可以总结:

  1. 使用new关键字创建一个类对象,自动调用类的构造函数;
  2. 使用delete关键字销毁一个类对象,自动调用类的析构函数;

韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

以上是关于C++类对象的动态建立和释放的主要内容,如果未能解决你的问题,请参考以下文章

C++ 对象的动态建立 & 释放

C++中栈和堆上建立对象的区别

C++对象的动态建立与释放

C++函数中,两个自动释放内存的动态内存申请类

12.5 C++对象的动态建立

12.5 C++对象的动态建立