zoukankan      html  css  js  c++  java
  • 什么时候可以用delete替代delete[]

    针对gcc编译器

    C++内存分配和释放函数

    //分配单个对象
    operator new(std::size_t size)
    
    //分配数组对象
    operator new[](std::size_t size)
    

    这两个函数都有size参数,作为传入要分配空间的大小,内部实现完全一样。只不过在分配数组空间之前,会在前面的空间,填入数组空间的大小。下面我猜测的伪代码

    new Object[int size]{
        if(trival(Object析构函数)){
            Object *ptr = operator new[](size * sizeof(Object));
            for(int 0-> size){
                构造函数(ptr);
            }
            return ptr;
        }
        //析构函数有用,
        //需要析构的时候需要找到找到每个对象的this指针
        //因此在返回地址的前(-8,-4)个字节保存对象的大小
        else{
            //比没有用户自定义的析构函数多8个字节
            Object *ptr = operator new[](size * sizeof(Object) + 8);
            *(int *)(ptr) = size;
            return ptr + 8;
        }
    }
    

    根据上面的分析,我们知道了只有析构函数有用(non-trival)的Object,operator new[]才回在前面保存分配的数组个数。

    什么时候可以用delete替换delete []

    1. 内置类型
    2. 用户自定义类型,但是有non-trival析构函数
  • 相关阅读:
    notebook笔记
    from __future__ import absolute_import
    GUI
    version_info
    函数参数
    None
    exec、eval
    os
    IGeometry接口
    IGeometry接口
  • 原文地址:https://www.cnblogs.com/biterror/p/7053412.html
Copyright © 2011-2022 走看看