IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> C++ 内存管理之operator new -> 正文阅读

[移动开发]C++ 内存管理之operator new

C++ 内存管理之operator new

C++提供了new和delete方式来申请和释放堆区内存,但new和delete是指的expression,而底层是operator new函数。下面来区分一下这几个概念。

  • new/delete expression

    new expression动态分配内存,delete expression释放内存。网上也有说是new operator的,这种说法属实容易让人误解?.?.?.😅

    • new expression的行为分析

      1. 通过调用合适的内存分配函数,也就是operator new()

      2. void指针转型和初始化对象,类似于

        A* p = static_cast<A*>(::operator new(size))p->A();
        

        但是用户不能直接这样调用,只能用placement new,即new(static_cast<A*>p) A()

      A* p = new A;
      	  // allocates memory by calling: operator new (sizeof(A))
            // and then constructs an object at the newly allocated space
      
    • delete expression的行为分析

      1. 调用析构
      2. 释放内存
    • placement new

      在已分配的内存空间上,初始化对象(调用构造函数)

      如果给new-expression提供了placement-params(指针),这个参数会作为placement new版本的operator new的额外参数,具体为void* operator new(std::size_t, void*),这个函数只是返回第二个参数。

      注意这种方式,需要手动调析构函数,否则可能会内存泄露

      // within any block scope...
      {
          alignas(T) unsigned char buf[sizeof(T)];
          // Statically allocate the storage with automatic storage duration
          // which is large enough for any object of type `T`.
          T* tptr = new(buf) T; // Construct a `T` object, placing it directly into your 
                                // pre-allocated storage at memory address `buf`.
          tptr->~T();           // You must **manually** call the object's destructor
                                // if its side effects is depended by the program.
      }                         // Leaving this block scope automatically deallocates `buf`.
      
  • operator new

    allocation functions,<new>中给出了三个版本

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

    第一个版本,分配size字节的空间,失败throw std::bad_alloc

    第二个版本,分配size字节的空间,不抛出异常,return null

    第三个版本,直接返回ptr,当使用new-expression调用此版本时,是placement new

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:08:36  更:2022-01-08 14:10:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:27:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码