(十九)特殊工具与技术

auto sp = new string("a value");

auto arr = new string[10];

new表达式调用一个名为 operator new(或operator new[]) 的标准库函数,该函数分配一块足够大的,原始的,未命名的内存空间,运行相应的构造函数,传入初始值,返回空间地址.


delete sp;

delete [] arr;

delete表达式 对sp对象或arr数组中的元素调用相应的析构函数,然后调用名为 operator delete(或者 operator delete[])的标准库释放内存空间.


可以再全局定义 operator new 函数和 operator delete函数,也可以将他们定义为成员函数.如果是成员函数,那么他们是隐士静态的,相当于加了 static,也可以手动添加.

定义new  返回类型必须是 void *,第一个参数必须是size_t

定义delete 返回类型必须是void, 第一个参数类型必须是void*;

void *operator new(size_t size)
{
    if(void *mem = malloc(size))
      return mem;
    else
      throw bad_alloc();
}

void operator delete(void *mem) noexcept  {  free(mem); }

定为new,允许我们在一个特定的,预先分配的内存低智商构造对象,当传入一个指针类型的实参时,定为new表达式只构造对象但不分配内存.

new(add) type
new(add) type (initializers)
new(add) type [size]
new(add) type [size] {初始值列表}

//add必须是一个指针,在initializers中提供一个逗号分隔的初始值列表

显示调用析构函数

sp->~string();//析构函数会销毁对象,但是不会释放内存,还可以重新使用该空间


运行时类型识别(RTTI)

typeid运算符,用于返回表达式的类型.

dynamic_cast运算符,用于将基类的指针或引用安全的转换成派生类的指针或引用

当作用于一个类型,切该类型有虚函数时,运算符使用指针或引用所绑定对象的动态类型.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值