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

  • 相关阅读:
    程序员的希波克拉底誓言[精华]
    怎样成为优秀的软件模型设计者
    C#中Delegate浅析与思考
    程序员是一个美好的职业[精华]
    hdu 1421(搬寝室)
    hdu 4022(map一对多)
    hdu 1114(完全背包)
    hdu 1159(最长公共子序列)
    hdu 2844(多重背包)
    hdu 1257(最长递增子序列)
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330421.html
Copyright © 2020-2023  润新知