zoukankan      html  css  js  c++  java
  • 深入new/delete:Operator new的全局重载

    Operator new 的全局重载

    原文地址:http://blog.csdn.net/zhenjing/article/details/4354880

    我们经常看到这么一句话: operator new 可以重载, placement new 不可重载。其实此处所说的不可重载应该是指全局的 placement new 不可重载,对于类域中的 placement new 是可以重载的,而且只要重载了任何一种形式的 operator new 都应该顺便重载 placement new , 即 void * operator new(std::size_t count, void *ptr) 。

    操作符重载一般用于特定类型,名字解析过程同一般的函数重载。 Operator new 由于其特殊性,编译器提供了默认提供 6 种全局重载形式,同时还允许用户提供自定义的全局 operator new ,其参数甚至可以和全局版本一样,除全局 placement new 外。对于类域,任何形式的 new 都是可以重载的,包括 placement new 形式。

    全局的 operator new( 函数 ) 有六种重载形式

    void *operator new(std::size_t count)

        throw(std::bad_alloc);           // 一般的版本

    void *operator new(std::size_t count,   // 兼容早版本的 new

        const std::nothrow_t&) throw();   // 内存分配失败不会抛出异常

    void *operator new(std::size_t count, void *ptr) throw();  //placement 版本

                                          

    void *operator new[](std::size_t count)  //

        throw(std::bad_alloc);

    void *operator new[](std::size_t count,  //

        const std::nothrow_t&) throw();

    void *operator new[](std::size_t count, void *ptr) throw();

    重载 operator new 规则

    重载 operator new 的参数个数是可以任意的 , 只需要保证第一个参数为 size_t, 返回类型为 void * 即可 , 而且其重载的参数类型也不必包含自定义类型 . 更一般的说 , operator new 的重载更像是一个函数的重载 , 而不是一个操作符的重载 . 如:

    全局重载示例:

    void* operator new(size_t size)  // 重载成功

    {

       printf("global new/n");

       return malloc(size);

       //return ::operator new(size);  // 递归调用提示 (warning)

    }

    //void *operator new(std::size_t size, void *ptr) // 无法重载

    //{

    //     printf("global new/n");

    //     return ::operator new(size,ptr);

    //}

    void * operator new(size_t size, const std::nothrow_t& e) // 重载成功 , 递归调用提示 (warning)

    {

           printf("global new/n");

           return ::operator new(size, e);

    }

    一般形式的 operator new 重载示例:

    void * operator new(size_t size, int x, int y, int z)

    {

        ...

    }

    X * pX = new (1, 2, 3) X;

    char data[1000][sizeof(foo)];

    inline void* operator new(size_t size, int n)

    {

            return data[n];

    }

    就可以使用这样有趣的语法来创建对象 :

    foo *p=new(6) foo(); // 把对象创建在 data 的第六个单元上

  • 相关阅读:
    MySQL-基本sql命令
    Java for LeetCode 203 Remove Linked List Elements
    Java for LeetCode 202 Happy Number
    Java for LeetCode 201 Bitwise AND of Numbers Range
    Java for LeetCode 200 Number of Islands
    Java for LeetCode 199 Binary Tree Right Side View
    Java for LeetCode 198 House Robber
    Java for LeetCode 191 Number of 1 Bits
    Java for LeetCode 190 Reverse Bits
    Java for LeetCode 189 Rotate Array
  • 原文地址:https://www.cnblogs.com/dragon2012/p/3571838.html
Copyright © 2011-2022 走看看