代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

调用类特定的运算符new

  •  3
  • fredoverflow  · 技术社区  · 15 年前

    表达式 operator new(sizeof(T)) 分配 T 字节通过 ::operator new 对吗?

    有什么方法可以调用特定于类的 operator new 如果它存在 就这样 new T() 分配内存(在调用构造函数之前)?

    T::operator new(sizeof(T)) 如果 T 没有定义 算子新 ,即使 T 从定义它的基类继承。我想打电话给:

    • Foo::operator new 如果 Foo 定义 算子新
    • Base::operator new 如果 来源于 Base 定义 算子新 (我该如何处理多重继承?)
    • :新操作员 否则
    2 回复  |  直到 15 年前
        1
  •  1
  •   Mark B    15 年前

    标准库使用一个分配器对象来解决这个问题,该对象的类型被设置为需要自定义分配算法的类的模板参数。

    我不认为有任何完整的方法来完成你的要求,已经证明你的第二颗子弹。如果编译器都定义了一个运算符,就无法知道新使用哪个父运算符。

    如果您试图实现一个小对象分配器池,它在编译时选择适当的大小/池,那么使用一个独立的模板分配器函数怎么样:它被称为 object_allocator<T>::allocate() 模板类型可以让您自动计算出大小。由于存在多重继承问题,您仍然不能继承新的操作符,但它使您很容易了解如何在任何类中分配内存。

        2
  •  0
  •   Alexey Malistov    15 年前

    定义不同的静态函数 allocate 并从调用此函数 T::operator new

    class X {
    public:
        static void * allocate(size_t size) {
               //...
        }
        void *operator new(size_t size) {
           return allocate(size);
        }
    };
    
    void f() {
       void * p = X::allocate(sizeof(X));
       X * x = new(p) X;
    }