Thinking in C++(4)

本文详细探讨了面向对象编程(OOP)中对象的创建与销毁过程,包括对象存储位置的选择及其对程序性能的影响。介绍了栈和静态存储区的快速分配与释放特性,以及堆上动态创建对象的方法。通过对比malloc和new操作符,阐述了它们在内存分配、类型转换、初始化和错误检查方面的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P11

OOP ---Object-orient Programming(面向对象的编程)

创建和销毁对象 (对象的数据存放在何处?如何控制对象的生命期?)

1)为了最大化运行速度,通过将对象存放在栈(stack)中或者静态存储区域中。栈是内存中的一个区域,可以直接由微处理器在程序执行期间存放数据。存放在栈中的变量称为自动变量(automatic variable)或者局部变量(scoped variable)。静态存储区域简单说是内存的一个固定块,在程序开始执行以前分配。使用这两种方式,可以实现快速分配和释放,编译器决定这个对象持续多长时间,并能自动销毁它。然而,同时牺牲了灵活性。因为,程序员必须在写程序时知道对象的准确数量、生命期和类型。

2)在堆(heap)中动态创建对象。使用这种方法可以直到运行时还不知道需要多少个对象、对象的生命期及具体数据类型。如果需要新的对象,直接使用new关键字让它在堆上生成,使用结束时,使用delete释放。

P306
C--从堆中获取存储单元的方法
C在他的标准库函数中提供了一些函数用以动态分配内存:malloc()以及它的变种calloc()和realloc(),释放内存返回给堆的函数free()。举例说明如下:
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
Class Obj{
int i, j, k;
enum{sz = 100};
char buf[sz];
public:
void initialize(){
cout<<"initializing Obj"<<endl;
i = j = k = 0;
memset(buf,0,sz);
}
void destroy() const{
cout<<"destroying Obj"<<endl;
}
};
int main(){
Obj* obj = (Obj*)malloc(sizeof(Obj));
if(obj == NULL) return -1;
obj->initialize();
obj->destroy();
free obj;
}

使用malloc及free来给对象分配动态内存时,
1)用户必须决定对象的长度。
2)由于malloc函数只是分配了一块内存,所以它返回的是void*类型的指针,因此需要进行类型转换。
3)另外,利用malloc分配完内存后,用户必须检查返回的指针以确保分配成功。
4)对象的内存空间分配成功后,用户必须对其进行初始化,因为此时对象的构造函数并未被使用。

P307
operator new -- new运算符
当使用new创建一个对象的时候,它就在堆里为对象分配内存并为着块内存调用构造函数!如:
MyType *fp = new MyType(1,2);
运行时等同于调用了malloc并将(1,2)作为参数为MyType调用构造函数,this指针指向返回值得地址。另外,new还进行检查以确认内存分配成功,因此不必显示的确认调用成功。

operator delete -- delete运算符
delete首先调用析构函数,然后释放内存。如果正在删除的对象的指针是NULL,将不发生任何事情。因此通常在delete指针后,将其赋值为NULL,防止再次删除。

P314
用于数组的new和delete
MyType *fp = new MyType[10];
这样在堆上为10个MyType对象分配了足够的内存,并为每一个对象调用了构造函数,但是仅拥有一个MyType*。
在使用delete对这样的fp进行释放内存的时候,应该delete []fp;。这样才可以保证10个对象的析构函数都被调用,10个对象都被释放。

举一个二维动态指针的分配方法:
...
int m,n;
int i = 0;
int **ppA = NULL;//ppA -- m*n matrix
ppA = new int*[m];
for(i=0; i<m; i++){
ppA[i] = new int[n];
}
...
for(i=0; i<m; i++){
delete []ppA[i];
ppA[i] = NULL;
}
delete ppA;
ppA = NULL;
...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值