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



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/04/15/1154258.html,如需转载请自行联系原作者
目录
相关文章
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
223 1
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
234 0
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
297 1
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
1159 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
308 0
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(4) 常用拷贝和替换算法
黑马c++ STL常用算法 笔记(4) 常用拷贝和替换算法
|
存储 算法 搜索推荐
黑马c++ STL常用算法 笔记(3) 排序算法
黑马c++ STL常用算法 笔记(3) 排序算法
|
算法 C++
黑马c++ STL常用算法 笔记(2) 查找算法
黑马c++ STL常用算法 笔记(2) 查找算法
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第二章 构造/析构/赋值运算 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第二章 构造/析构/赋值运算 笔记
202 0