zoukankan      html  css  js  c++  java
  • C++进阶--placement new/delete

    //############################################################################
    // Placement New 和 Placement Delete
    
    // 标准的Operator new/delete:
    void* operator new(std::size_t size) throw(std::bad_alloc);
    void operator delete(void* pMemory) throw();
    
    /*
     * Placement new:  除了size_t param参数外,还带其他额外参数的operator new
     * Placement delete:  除了void* param参数外,还带其他额外参数的operator delete
     *
     * 注意: 他们需要成对提供
     */
    
       static void* operator new(size_t szie, void* pMemory) throw(bad_alloc);
       static void* operator delete(void* pMemory, void* pMemory) throw();
    /*
     * STL中提供. 新创建的对象将放在pMemory位置.
     */
    
    int function_A() {
       int buffer[100000];
       dog* pd = new(buffer) dog();
    }
    
    
    
    // 是否需要delete pd?
    // 内存并不是在堆上分配,所以不需要释放,但是需要手动析构
    // pd->Dog::~Dog(); //显式地调用析构函数
    // 注意此析构方法,不能用于普通的在栈上分配的对象,否则离开作用域的时候会再析构一次
    // 同样也不能用于普通的动态分配对象,只会析构,不会释放内存
    
    class dog {
       ...
       dog() { throw 20; }
       static void* operator new(size_t szie, ostream& log) throw(bad_alloc){
          log << "Customized new for dog.
    ";
          return ::operator new(size);
       }
    //   static void* operator delete(void* pMemory, ostream& log) throw() {
     //     log << "Customized delete for dog.
    ";
      //    free(pMemory);
      // }
    }
    
       ...
       dog* pd = new(std::cout) dog();
    
    
  • 相关阅读:
    rebar
    namenode ha
    jmx
    doclint in jdk8
    maven source
    avd
    ccw-ide
    ST3使用
    Web worker
    离线web-ApplicationCache
  • 原文地址:https://www.cnblogs.com/logchen/p/10182587.html
Copyright © 2011-2022 走看看