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[]的原因。

  • 相关阅读:
    (OK) error: code model kernel does not support PIC mode
    compile android for x86_64
    内核开发的前途在什么地方,发展方向有哪些?
    SOA 与 MSA(微服务架构)
    [Android] adb命令如何获取android手机屏幕分辨率
    (2) 在 Build 系统中添加新的内容
    (1) 理解 Android Build 系统
    (OK) [solved] error
    Error while building CM 13 (KERNEL_OBJ/usr, needed by libtinyalsa_intermediates/mixer.o)
    (OK) http://www.android-x86.org
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330421.html
Copyright © 2011-2022 走看看