动态对象

来源:互联网 发布:java中文编译器 编辑:程序博客网 时间:2024/06/05 11:55

对象创建:

在C++中创建一个对象分为两个步骤:第一,为对象分配内存;第二,调用构造函数初始化内存。

对象内存分配:

1.静态存储区,对象在程序开始之前就可以分配内存生存周期是整个程序运行期间。

2.,任何时候到达一执行点(左大括号),都可以在栈上分配内存,出了执行点(右大括号),这个存储单元将会自动被释放。这些栈分配的运算内置于处理器的指令集中。在写程序的时候必须知道需要多少个存储单元,以便编译器生成正确的指令。

3.,存储单元也可以在堆(自由存储单元)上分配。这称为动态内存分配,在运行时调用程序分配这些内存。程序员决定何时释放这块内存。动态分配的内存生存周期又编程人员决定,而不受范围的限制。

通常这三个区域被放在一块连续的物理存储单元中,三者的顺序由编译器的开发者决定,但没有一定的规则。

C中动态分配存储单元:

在堆中申请内存的函数有malllo(),calloc(),realloc(),释放内存返回给堆用free()。

Obj* obj = (Obj*) malloc(sizeof(Obj));

在这里编程人员必须决定对象的长度。malloc()函数只是分配一块内存,并不是生成一个对象,所以函数会返回一个void* 指针。在C++中不允许将一个void*指针赋给其他类型的指针,所以必须做显示类型转换。malloc()函数可能找不到能够分配的内存(此时返回0),所以使用时必须检查内存是否分配成功。在使用对象之前一定要确保初始化,这是经常出错的原因。应该清楚,构造函数不能显示的被调用,他是在对象创建时由编译器调用。很多时候在使用对象的时候忘记初始化,造成程序出错。

C++中动态对象创建:

C++中使用new运算符创建一个新的对象时,它会在堆中为对象分配内存并为这块内存调用构造函数

Obj  *new_obj = new Obj(1,2);

运行时等价于调用malloc(sizeof(Obj)) 并使用参数表(1,2)为Obj调用构造函数,this指针指向返回值的地址。指针赋值给new_obj。默认的new会检查确定在传递地址之前内存是分配成功的。如果构造函数没有参数表,可以调用无参的构造函数,于是创建新变量可以写成

Obj *new_obj = new Obj;

delete:

delete 表达式首先调用析构函数,然后释放内存(经常是调用free())。delete表达式需要一个对象的地址,delete new_obj;如果用delete删除malloc(),realloc(),calloc()创建的对象,很可能没有调用析构函数就释放了内存。

对象数组的释放:

MyType* fp = new MyType[100];

当使用上面的语句创建一个对象数组后,我们要释放堆上的空间需要用:

delete []fp;

方括号告诉编译器产生代码,该代码的任务是将数组从创建时存放在某处的对象数量取回,并为数组的所有对象调用析构函数。如果使用语句delete fp;造成的结果是只释放了数组的第一个数据的内存空间,另外的99个对象并没有调用析构函数。



0 0
原创粉丝点击