| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 318 人关注过本帖
标题:【重载】重载new和new[]
只看楼主 加入收藏
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
结帖率:96.08%
收藏
已结贴  问题点数:20 回复次数:6 
【重载】重载new和new[]
RT

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

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

2013-10-27 22:28
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
你想重载全局的operator new[],还是某类的operator new[]?
两者的实现细节有一点点不同
对于全局的,需要在内存分配后尝试一下set_new_handler
对于某类的,需要在内存分配前判断是不是本类型的(有可能是派生类型的。)
2013-10-28 08:25
blueskiner
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:227
专家分:707
注 册:2008-9-22
收藏
得分:5 
重载内存分配操作符,目的为了什么?先搞清楚这点。
2013-10-28 08:42
木容木水
Rank: 2
等 级:论坛游民
帖 子:44
专家分:25
注 册:2013-2-24
收藏
得分:0 
学习中
2013-10-29 11:27
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
回复 2楼 rjsp
你说的某类的operator new[]是什么意思?是说经过自己的重载之后的new?

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


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-10-29 12:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:15 
以下是引用蚕头燕尾在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;
}

2013-10-29 15:42
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
学习了

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-10-30 07:01
快速回复:【重载】重载new和new[]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.090060 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved