c++ <new定位运算符>与<显式调用析构函数> - 练习题

#include <iostream>
#include <cstring>
using namespace std;

class People
{
private:
	char *name;
	int age;
public:
	People(){name=0;};
	People(char *na, int ag=18): age(ag)
	{
		int sz = strlen(na)+1;
		name = new char[sz];
		strcpy_s(name, sz, na);
	}
	~People()
	{
		cout<<name<<" has been successfully deleted!"<<endl;
		delete[] name;
	}
	void show()
	{
		cout<<name<<endl;
	}

};


int main()
{
	if (1)
	{
		//char buffer[20]; // 采用这一句,则无需delete[] buffer;其他均一样
		char *buffer= new char[20];
		People *p1 = new(buffer) People("chen"); // new 定位符将对象*p1定位到地址buffer上
		People *p2 = new(buffer+sizeof(*p1)) People("lol"); // 留出*p1的空间,防止*p2覆盖*p1
		p1->show();
		p2->show();
		// 这里使用 new 定位符的情况下,只能通过显式调用析构函数来释放对象中的 name 指针指向的内存
		// 因为 delete 只能释放 new 常规运算符所分配的地址
		//delete p2,p1; // 使用这一句的话会报错!debug assertion failed!
		p2->~People();
		p1->~People(); // 释放顺序尽量与创建顺序相反!
		delete[] buffer;
	}
	
	cin.get();
}


结果如下所示:




要注意区分new 运算符的2种含义:

  1. 常规new运算符,用于动态分配内存,需与delete配合使用!
  2. 定位new运算符,用于将对象(或基本数据类型)存储到指定内存位置,如 int *a = new((int*)1) int(2); 即将a指向内存地址为1的地方,并在该内存处放入整型2
注意不管是哪种类型,new 都是和地址相关的操作符,因此返回一个地址,等号左边必须是一个指针才可以接收!
在上面代码中无法使用 delete 的情况下,只能通过显式析构来释放对象成员中指针name指向的堆中内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值