C++ 深入new

1,C++ new首先作为运算符和关键字使用,类似sizeof,可以认为是编译器内置的,不能改变其行为,例如:

A *a=new A;int *i=new int;

对普通类型而言,只是分配空间。而对类类型,不仅分配空间,还调用类的构造函数,例如:

Class *pc = new Class;delete pc;

编译器翻译为

void *p = operator new(sizeof(Class));
// 对p指向的内存调用Class的构造函数,此处无法用直观的代码展现
Class *pc = static_cast<Class*>(p);
// ...
pc->~Class();
operator delete(pc);

如果类A重载了new成员函数,使用new关键字的时候直接调用类A的new函数。否则,使用全局new,类中new的重载仅仅影响重载类的内存分配策略。

2,全局new函数,和全局operator+() 一样,只不过是普通的函数,是可以重载的,重载后会影响所有对象的分配策略。

::operator new(size_t size) throw(bad_alloc);

使用new关键字的时候,首先调用全局::operator new分配空间大小 ,如果分配失败调用用户指定的失败处理函数,否则抛出bad_alloc。

void * operator new(std::size_t size) throw(std::bad_alloc) {
    if (size == 0)
        size = 1;
    void* p;
    while ((p = ::malloc(size)) == 0) {
        std::new_handler nh = std::get_new_handler();
        if (nh)
            nh();
        else
            throw std::bad_alloc();
    }
    return p;
}

3,placement new

placement new ,即是一个全局 operator new 的重载版本。对象指针指向的空间不限于堆空间,也可以指向栈上,以此来实现自己的内存池。

inline void* operator new  (std::size_t, void* __p) {return __p;}

可以看到, placement new 除了正常的size参数外,还多了一个空指针参数,而且,它也没干什么内存分配的活,而是直接返回了这个指针。使用如下:

void *buf =; // 在这里为buf分配内存
Class *pc = new (buf) Class();

4,::operator new []、类的new[]重载和使用与new类似。

转载于:https://my.oschina.net/u/221120/blog/649098

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值