《Effective C++》笔记(一)

1,处理operator new内存分配失败的情况

#include <iostream>
using namespace std;
template
<typename T>    
class newhandlersupport 
{    //提供类set_new_handler支持的基类
public:
    
static new_handler set_new_handler(new_handler p);
    
static void* operator new(size_t size);//重载operator new运算符
private:
    
static new_handler currenthandler;//当前的new_handler
}
;
template
<typename T>
new_handler newhandlersupport
<T>::set_new_handler(new_handler p)
{
    new_handler oldhandler 
= currenthandler;
    currenthandler 
= p;
    
return oldhandler;
}

template
<typename T>
void* newhandlersupport<T>::operator new(size_t size)
{
    new_handler globalhandler 
= std::set_new_handler(currenthandler);//申请内存前先设置新的new_Handler
    void *memory;
    
try 
    
{
        memory 
= ::operator new(size);//实际分配内存
    }

    
catch (std::bad_alloc&
    
{
        std::set_new_handler(globalhandler);
//恢复旧的new_handler
        throw;//抛出异常
    }

    std::set_new_handler(globalhandler);
    
return memory;
}

template
<typename T>
new_handler newhandlersupport
<T>::currenthandler = NULL;


class GamePlayer : public newhandlersupport<GamePlayer>
{
private:
    
static const int NUM_TURNS;
    int *scores;

public:
    GamePlayer();
    
~GamePlayer();
}
;
const int GamePlayer::NUM_TURNS = 5;
GamePlayer::GamePlayer()
{
    cout
<<"构造函数"<<endl;
    scores 
= new int[NUM_TURNS];
    memset(scores,
0,sizeof(scores));
    
for (int i =0;i<NUM_TURNS;++i)
    
{
        scores[i] 
= i;
    }

}

GamePlayer::
~GamePlayer()
{
    cout
<<"析构函数"<<endl;
    
for (int i=0;i<NUM_TURNS;++i)
    
{
        cout
<<scores[i]<<'\t';
    }

    cout
<<endl;
    delete [] scores;
    scores 
= NULL;
}

void nomorememory()
{
    cerr 
<< "unable to satisfy request for memory\n";
    abort();
}

int main()
{    
    ::set_new_handler(nomorememory);
    GamePlayer::set_new_handler(nomorememory);
    GamePlayer
* pPlayOne = new GamePlayer();
    delete pPlayOne;
    GamePlayer::set_new_handler(NULL);
    
try
    
{
        GamePlayer
* pPlayTwo = new GamePlayer();
        delete pPlayTwo;
    }

    
catch (std::bad_alloc&)
    
{
        cerr
<<"operator new failed"<<endl;
    }

    system(
"pause");
    
return 0;
}

posted on   Phinecos(洞庭散人)  阅读(657)  评论(3编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2007-04-15 OpenGL入门笔记(一)

导航

统计

点击右上角即可分享
微信分享提示