new的一个可能实现

来源:互联网 发布:华为手机人工智能在哪 编辑:程序博客网 时间:2024/06/06 09:51
#include<iostream>using namespace std;new_handler g_new_handler_f = NULL;class A{public:    A(){ std::cout << "constructor" << std::endl; /* throw int();*/}    ~A(){ std::cout << "destructor" << std::endl; }};new_handler set_new_handler_f(new_handler new_f){    new_handler p = g_new_handler_f;    g_new_handler_f = new_f;    return p;}void new_handler_f(){    std::cout << "new_handler_f" << std::endl;}//new的一个可能的实现void* operator new(size_t size){    std::cout << "void* operator new(size_t size)" << std::endl;    if (size == 0)        size = 1; // 这里保证像 new T[0] 这样得语句也是可行的    void *p = NULL;    while (!(p = malloc(size))) //不断尝试申请    {        if (g_new_handler_f)            (*g_new_handler_f)(); //期望g_new_handler_f函数里面能够找到可用的内存        else            throw bad_alloc("exception from new.");    }    return p;}//delete的一个可能实现void operator delete( void *ptr ){    std::cout << "void operator delete( void *ptr )" << std::endl;    if(ptr)  // 从这里可以看出,删除一个空指针是安全的        free(ptr);} int main(){    set_new_handler_f(new_handler_f);//设置处理函数    try    {        A* p = new A;        delete p;    }    catch(bad_alloc& e)    {        std::cout << e.what() << std::endl;    }    catch(int)    {    }    system("pause");    return 0;}

原创粉丝点击