注册 登录
编程论坛 C++教室

【重载】重载new和new[]

蚕头燕尾 发布于 2013-10-27 22:28, 318 次点击
RT

大家谁这么做过,请给个例子。

另外欢迎就此问题展开讨论。

6 回复
#2
rjsp2013-10-28 08:25
你想重载全局的operator new[],还是某类的operator new[]?
两者的实现细节有一点点不同
对于全局的,需要在内存分配后尝试一下set_new_handler
对于某类的,需要在内存分配前判断是不是本类型的(有可能是派生类型的。)
#3
blueskiner2013-10-28 08:42
重载内存分配操作符,目的为了什么?先搞清楚这点。
#4
木容木水2013-10-29 11:27
学习中
#5
蚕头燕尾2013-10-29 12:15
回复 2楼 rjsp
你说的某类的operator new[]是什么意思?是说经过自己的重载之后的new?

难到new不是全局公用的一个操作符么,就像+ - * /这样的……

#6
rjsp2013-10-29 15:42
以下是引用蚕头燕尾在2013-10-29 12:15:43的发言:

你说的某类的operator new[]是什么意思?是说经过自己的重载之后的new?

难到new不是全局公用的一个操作符么,就像+ - * /这样的……

new/delete分两种,一种是全局的,另一种是针对特定类的,我写个demo给你
程序代码:
#include <iostream>
using namespace std;

struct foo
{
    explicit foo( int val=0 ) : val_(val)
    {
        cout << "(" << val_ << ")";
    }
    ~foo()
    {
        cout << "<" << val_ << ">";
    }
    int val_;

    static void* operator new[]( size_t size ); // 类形式的new/delete
    static void operator delete[]( void* raw );
};

char buf[1000];

void* foo::operator new[]( size_t size )
{
    //如果不是本类的,而是派生类的,要明确拒绝之
   
//    return ::operator new(size);

    if( 0 == size ) // 须要注意
        size = 1;

    //分配size字节内存;
   
//if(分配成功)
   
//    return 指向内存的指针;
    return buf; // 我只是做个演示

    throw std::bad_alloc();
}

void foo::operator delete[]( void* raw )
{
    //如果不是本类的,而是派生类的,要明确拒绝之
   
//{
   
//    ::operator delete(raw);
   
//    return;
   
//}

    if( 0 == raw ) // 须要注意
        return;

    // 释放分配的内存
   
// 我只是做个演示
}

int main()
{
    delete[] new foo[2];

    return 0;
}

#7
蚕头燕尾2013-10-30 07:01
学习了
1