C++_类和动态内存分配5-使用指向对象的指针

再探new和delete

new为创建的每一个对象的名称字符串分配存储空间,这是在构造函数中进行的;

析构函数使用delete来释放这些内存。

字符串是一个字符数组,所以析构函数使用的是带中括号的delete。

 

使用new来为整个对象分配内存:

String * favorite = new String(saying[choice]);

 

这不是为要存储的字符串分配内存,而是为对象分配内存;也就是说,为保存字符串地址的str指针和len成员分配内存。

指针和对象小结

使用常规表示法来声明指向对象的指针:

String * glamour;

 

可以将指针初始化为指向已有的对象;

String * first = &saying[0];

 

可以使用new来初始化指针,这将创建一个新的对象

String * favorite = new String(sayings[choice]);

 

对类使用new将调用相应的类构造函数来初始化新创建的对象:

//调用默认构造函数

String * gleep = new String;

 

//调用 String(const char *) 构造函数

String * glop = new String(“my my my”);

 

//调用 String(const String &)构造函数

String * favorite = new String(saying[choice]);

 

可以使用->运算符通过指针访问类方法:

if (saying[i].length()< shortest ->length())

 

可以对对象指针应用解除引用运算符(*)来获得对象

if (saying[i]<*first)

       first = &saying[i];

 

12.5.3 再谈定位new运算符

定位new运算符能够让您能够在分配内存时能够指定内存位置。

 

char * buffer = new char[BUF];

JustTesting *pc1;

pc1 = new (buffer) JustTesting;  //定位new运算符

pc2 = new JustTesting(“Heap”,20);

pc3 = new (buffer +sizeof(JustTesting))JustTesting(“Better Idea”, 6);

使用定位new运算符来为对象分配内存,必须确保其析构函数被调用。如何确保呢?、对于在堆中创建的对象,可以这样做。

delete pc2;

 

但是对于pc1却不可以,原因在于delete可以与常规new运算符配合使用,却不能与定位new运算符配合使用。

Pc3没有收到new运算符返回的地址。因此delete pc3将导致运行阶段错误。

Delete pc1将释放buffer,而不是pc1;

系统没有为定位new运算符在该内存块中创建的对象调用析构函数。

对于这种情况,需要显式地为定位new运算符创建的对象调用析构函数。这是少数几个需要显式调用析构函数的情形。

 

pc3 ->~JustTesting();

pc1 ->~JustTesting();  //销毁对象的顺序,先销毁后创建的对象。类似于栈的先进后出顺序。

仅当所有对象都被销毁后,才能释放用于存储这些对象的缓冲区。

转载于:https://www.cnblogs.com/grooovvve/p/10493521.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值