龙空技术网

动态内存分配

书山学海0 142

前言:

现在咱们对“使用堆运算符可以动态建立或删除对象”可能比较讲究,你们都想要知道一些“使用堆运算符可以动态建立或删除对象”的相关内容。那么小编同时在网上汇集了一些对于“使用堆运算符可以动态建立或删除对象””的相关知识,希望你们能喜欢,你们快快来学习一下吧!

动态内存分配技术可以保证程序在运动过程中按照实际需要申请适量的内存,使用结束后还可以释放,这种程序运行过程中申请和释放的内存单元也成为堆对象,申请和释放过程一般称为建立和删除。

在C++程序中建立和删除堆对象使用两个运算符:new 和delete。

new:

功能:动态分配内存,也可以称为动态创建堆对象。

语法形式:new 数据类型 (初始化参数列表);

该语句在程序运行过程中申请分配用于存放指定类型数据的内存空间,并根据初始化参数列表中给出的值进行初始化。如果内存申请成功, new运算便返回一个指向新分配内存首地址的类型的指针,可以通过这个指针对堆对象进行访问;如果申请失败,会抛出异常。

如果建立的对象是一个基本类型对象,初始化过程就是赋值,例如: int *point; point=new int(2);动态分配了用于存放int类型数据的内存空间,并将初值2存入该空间中,然后将首地址赋给指针point。细节:对于基本数据类型,如果不希望再分配内存后设定初值,可以把括号省去,例如:int*point =new int;如果保留括号,但如果括号中不写任何数值,则可以用0对该对象初始化,例如:int *point=new int();

如果建立的对象是某一个类的实例对象,就是要根据初始化参数列表的参数类型和个数调用该类的构造函数。

delete:

功能:删除由new建立的对象,释放指针所指向的内存空间。

语法形式:delete 指针名;

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

注意:用new分配的内存,必须用delete加以释放,否则会导致动态分配的内存无法回收,使得程序占据的内存越来越大,这叫做“内存泄漏”。

实例(动态创建对象):

#include <iostream>

using namespace std;

class Point{

public:

Point():x(0),y(0){

cout<<"Default Constructor called."<<endl;

}

Point(int x,int y):x(x),y(y){

cout<<"Constructor called."<<endl;

}

~Point(){cout<<"Destructor called."<<endl;}

int getX(){return x;}

int getY(){return y;}

void move(int newX,int newY){

x=newX;

y=newY;

}

private:

int x,y;

};

int main() {

cout<<"Step one:"<<endl;

Point *ptr1=new Point; //动态创建对象,没有给出参数列表,调用默认构造函数

delete ptr1; //删除对象,自动调用析构函数

cout<<"Step two:"<<endl;

ptr1=new Point(1,2); //动态创建对象,并给出参数列表,调用有形参的构造函数

delete ptr1; //删除对象,自动调用析构函数。

return 0;

}

/*运行结果:

Step one:

Default Constructor called.

Destructor called.

Step two:

Constructor called.

Destructor called.*/

标签: #使用堆运算符可以动态建立或删除对象