zoukankan      html  css  js  c++  java
  • [C++] 关于delete和delete[]

    首先贴一段MFC的源代码:

    void __cdecl operator delete(void* p)
    {
            free(p);
    }

    void __cdecl operator delete[](void* p)
    {
        ::operator delete(p);
    }

    然后贴一点汇编:

    分析:

    其中的call operator delete (4051C1h) 就是去调用MFC的void __cdecl operator delete(void* p)

    其中的call operator delete[] (4051CBh) 就是去调用MFC的void __cdecl operator delete[](void* p)

    所以在这种情下,两者是完全等效的。

    分析:

    其中的call  A::`scalar deleting destructor' (402EA0h) 会call A::~A (402E00h) 然后call operator delete (4051C1h)

    其中的call  A::`vector deleting destructor' (402E20h)会循环的为每个对象call  `eh vector destructor iterator' (443C7Dh) 循环结束之后call operator delete[] (4051CBh)

    结论:

    1,对于char这样的基础数据类型,delete和delete[]是等价的。

    2,对于class A这样带析构函数的类型,delete和delete[]是不同的。

    3,如果只有一个对象,那么对象数组在逻辑上可以蜕化成一个对象,但是那样会多一些步骤,性能会稍差一些。这大概是C++需要同时保留delete和delete[]的原因。

  • 相关阅读:
    【转】彻底解决matplotlib中文乱码问题
    angularjs依赖注入,setInterval()功能
    【转】图解SQL的各种连接join
    关于c#调用matlab时,deploytool选项没有.NET Assembly的问题的解决
    SQL从其他服务器数据库导入数据到本地数据库中
    【转】Asp.net下载文件、文件流输出 直接输出文件
    【转】正则应用实例,如将多个空格改为1个空格
    【转】线程间操作无效:从不是创建控件 的线程访问它,解决办法
    js获取鼠标坐标,设置div的高度、位置、内容等,及注意要点
    Java线程阻塞的方法
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330421.html
Copyright © 2011-2022 走看看