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

对于重载了运算符new的类,可以使用全局运算符new吗?

  •  2
  • sharptooth  · 技术社区  · 14 年前

    operator new .

    class Class {
    public:
       void* operator new( size_t );
       void operator delete( void* );
    };
    

    该类的对象是否总是使用重载 新操作员 当我使用 new Class() 或者有没有可能 新操作员 在以下情况下使用 新建类() 构造出现在代码中?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Jon Purdy    14 年前

    超载的 operator new operator delete

    // Allocate using global new.
    MyClass* my_object = ::new MyClass();
    
    // Use object normally.
    my_object->my_method();
    
    // Deallocate using global delete.
    ::delete my_object;
    

    或者,作为一个极端的说明性例子,类似这样的事情:

    #include <new>
    
    // Use global placement new to allocate in a buffer created by global new.
    MyClass* my_object = ::new(::operator new(sizeof(MyClass))) MyClass()
    
    // Use object normally.
    my_object->my_method();
    
    // Explicitly invoke destructor.
    my_object->~MyClass();
    
    // Explicitly deallocate memory.
    ::operator delete(my_object);
    

    希望这有帮助。

        2
  •  5
  •   Hemant    14 年前

    operator new ,否则将始终使用重载 placement new operator 反正也不打算超载。

    class Test {
    public:
       void* operator new( size_t );
       void operator delete( void* );
    };
    
    int main()
    {
    Test* pTest1 = ::new Test();
    Test* pTest2 = new Test();
    
    /*
     do some stuff
    */
    
    ::delete pTest1;
    delete pTest2;
    return 0;
    }
    

    注意delete操作符使用了相应的定义。

        3
  •  0
  •   Community Tales Farias    7 年前

    我能想到的唯一可能的例外是新的安置 (discussed here)