new和delete运算符

1.

运算符new的使用,看起来似乎是个单一运算,比如

int *pi=new int(5);

但事实上它是由两个步骤完成的:

1.通过适当的new运算符函数实例,配置所需的内存:

//调用函数库中的new运算符

int *pi=__new(sizeof(int));

2.将配置得来的对象设立初值:

*pi=5;

delete运算符的情况类似,delete pi;

相当于是:

if(pi!=0)

__delete(pi);

注意:在C++中,new运算符实际上总是以标准的C malloc()完成,虽然并没有规定一定得这么做不可。相同情况下,delete运算符也总是以标准的C free()完成。

2.针对数组的new

nt p_array=new int[5];
vec_new()不会真正被调用,因为它的主要功能是把default constructor施行于class objects所组成的数组的每一个元素身上。倒是new运算符函数会被调用:
int p_array=(int)__new(5
sizeof(int));
相同情况,如果我们写:

struct simple_aggr
{
	float f1, f2;
};
simple_aggr *p_aggr = new simple_aggr[5];

vec_new()也不会被调用,因为simple_aggr并没有定义一个constructor或destructor,所以配置数组以及清除p_aggr数组的操作,只是单纯地获得内存和释放内存而已。这些操作由new和delete运算符来完成就行了。
然而,如果class定义了一个default construct,vec_new()就会被调用,配置并构造class objects所组成的数组。

在delete数组时,可以这样写:
delete [] p_array;
在编译器内部,应如何记录元素个数呢?一个明显的方法是为vec_new()所传回的每一个内存区块配置一个额外的word,然后把元素个数包藏在那个word之中。通常这种被包藏的数值称为cookie。另一种是维护一个联合数组,用于放置指针及大小。
至于delete由基类指针指向的数组

class Point {
public:
    Point();
    virtual ~Point();
};
class Point3d : public Point {
public:
    Point3d();
    virtual ~Point3d();
};
Point *ptr = new Point3d[10];

// 这并不是所需要的
// 只有Point::~Point被调用...
delete [] ptr;

我个人感觉这里有问题啊 虚析构函数那么point3d的虚析构函数也会被调用啊
在这里插入图片描述
编译器的结果也告诉我了,当我把析构函数改成非虚函数,只有point的析构函数被调用了,这里是不是书上写错了

3.Placement Operator new 的语意

定位new运算符
placement new:只是operator new重载的一个版本。它并不分配内存,只是返回指向已经分配好的某段内存的一个指针。因此不能删除它,但需要调用对象的析构函数。
如果你想在已经分配的内存中创建一个对象,使用new时行不通的。也就是说placement new允许你在一个已经分配好的内存中(栈或者堆中)构造一个新的对象。原型中void* p实际上就是指向一个已经分配好的内存缓冲区的的首地址。

调用方式如下:

     char Buf[255];

     Point* p = new(Buf)Point3d;
void *operator new(size_t,void *p)
{	
	return p;
}

在这里插入图片描述

这正是placement operator new牛逼的地方,这段代码决定objects被放置在哪 里;编译器保证object的constructor会施行于其上

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值