且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Effective C++》笔记(一)

更新时间:2022-09-18 13:35:32

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;
}



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/04/15/1154258.html,如需转载请自行联系原作者