• 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();
    
    
  • 相关阅读:
    SQL-Duplicate Emails
    c#创建可比较对象
    c#扩展方法
    C#Lambda和委托
    C#集合
    c#显示实现接口和隐式实现的区别
    bs同时上传文件以及文件信息
    sql查询数据库中所有 ,数据为空的表
    sql查询所有表名和描述
    MES数据采集模块小结
  • 原文地址:https://www.cnblogs.com/logchen/p/10182587.html
Copyright © 2020-2023  润新知