• 【C++】operator new/new operator/placement new之间的区别


    new operator


    new operator即是c++中的关键字new。比如A* = new A; 中的new就是new operator。
    它执行了三个步骤:

    1. 分配内存空间

    事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),否则调用全局::operator new(size_t ),后者由C++默认提供。

    2. 构造对象

    以上面的例子来说,就是调用A::A()构造对象。

    3. 返回地址

    operator new


    operator new有三种形式:

    throwing (1)    
    void* operator new (std::size_t size) throw (std::bad_alloc);
    nothrow (2) 
    void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();
    placement (3)   
    void* operator new (std::size_t size, void* ptr) throw();
    

    (1)(2)的区别仅是是否抛出异常,当分配失败时,前者会抛出bad_alloc异常,后者返回null,不会抛出异常。它们都分配一个固定大小的连续内存。

    A* a = new A; //调用throwing(1)
    A* a = new(std::nothrow) A; //调用nothrow(2)
    

    (3)是placement new,它也是对operator new的一个重载,定义于#include <new>中,它多接收一个ptr参数,但它只是简单地返回ptr。其在new.h下的源代码如下:

    #ifndef __PLACEMENT_NEW_INLINE
    #define __PLACEMENT_NEW_INLINE
    inline void *__cdecl operator new(size_t, void *_P)
            {return (_P); }
    #if     _MSC_VER >= 1200
    inline void __cdecl operator delete(void *, void *)
        {return; }
    #endif
    #endif
    

    它可以实现在ptr所指地址上构建一个对象(通过调用其构造函数)
    调用形式为:
    new(p) A(); //也可用A(5)等有参构造函数

    转自:http://blog.csdn.net/wudaijun/article/details/9273339

  • 相关阅读:
    什么是ROR
    Struts2中使用Session的两种方法
    js的时间操作方法
    产生4位包含大小字母与数字的验证码
    Java关键字this、super使用总结
    java 反射的实例
    Java语言中定义常量注意事项
    java 静态方法和实例方法的区别
    多线程的例子
    java 中的内省机制
  • 原文地址:https://www.cnblogs.com/cknightx/p/6758738.html
Copyright © 2020-2023  润新知