C++ operator new以及new operator的各种套路浅析

1.引子

        在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单。然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次。这也许对简单的程序并不重要,但对你在代码中控制内存却是十分必要的,是否能写一个自定义的分配器,某种高级内存管理表或一个特定的垃圾回收机制。这篇文章并不是一个综合的手册,而是一个C++中各种内存分配方法的概述。它面向已经很熟悉C++语言的读者。

2.原生operator new

        我们先从原生operator new开始。考虑如下代码,它用来分配5个int型的空间并返回指向他们的指针:
int* v = static_cast<int*>(::operator new(5 * sizeof(*v)));
        当像如上的调用,operator new扮演原生的内存分配角色,类似malloc,上面等价于:
int* v = static_cast<int*>(malloc(5 * sizeof(*v)));
        释放用operator new分配的内存用operator delete:
::operator delete(v);
        你愿意永远用原生new和delete函数吗?是,只在极少数不用,我在下面的文章中会论证的。为什么用它们而不用原来的可信的malloc和free呢?一个很充分的原因就是你想保持代码在C++领域的完整性。混合使用new和free(或malloc和delete)是很不可取的(big NO NO)。用new和delete的另一个原因是你可以重载(overload)或重写(override)这些函数,只要你需要。下面是个例子:
void* operator new(size_t sz) throw (std::bad_alloc)
{
    cerr << "allocating " << sz << " bytesn";
    void* mem = malloc(sz);
    if (mem)
        return mem;
    else
        throw std::bad_alloc();
}

void operator delete(void* ptr) throw()
{
    cerr << "deallocating at " << ptr << endl;
    free(ptr);
} 
        通常,注意到new被用来给内置类型,不包含用户自定义new函数的类的对象,和任意类型的数组分配空间,使用的都是全局的运算符new。当new被用来为已经被重定义new的类实例化时,用的就是那个类的new函数。
        下面来看下自带new函数的类。

3.特定类的operator new

        大家有时很好奇"operator new"和"new operator"的区别。前者可以是一个重载的operator new,全局的或者特定类或者原生的operator new。后者是你经常用来分配内存的C++内置的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值