C++的new和delete功能小窥

原文地址:http://www.cnblogs.com/TianFang/archive/2007/11/23/970446.html

C++在new和delete的时候到底在干些什么?

今天写了一个小程序测试一下C++在new和delete的时候到底在干些什么。

int g_num = 3;

class A
{
public:
    int value;
    A(int a):value(a){cout<<"A("<<a<<") called"<<endl;}
    ~A() {cout<<"~A("<<value<<") called"<<endl;}

    voidoperator new (size_t size)
    {
        cout<<endl<<"new "<<size<<endl;
        return &g_num;
    }

    void operator delete(void* p)
    {
        cout<<"delete"<<endl;
    }

};

为了检测new和delete的动向,我重载了new和delete函数。

测试new的功能的代码如下:

    cout<<g_num<<endl;

    cout<<endl;
    A *a = new A(1);

    cout<<g_num<<endl;
    cout<<a->value<<endl;

输出结果为:

g_num=3

new 4
A(1) called
g_num=1
a=1

由于A的new函数并没有分配内存,只是把g_num的地址赋给了它,所以A的值改变也直接导致了g_num的值改变。

由打印信息可以看出,"new A(1)"其实执行了两个函数:

  1. 调用new分配内存
  2. 调用A(1)实现初始构造

而默认的new函数就只是调用了malloc和sizeof分配了一下内存而已,我以前还一直以为这是一个函数,构造函数也是在new中调用的

测试delete的功能的代码如下:

delete a;

输出结果如下:

~A(2) called
delete

这里也可以看出,"delete a"也是执行的两个函数:

  1. 调用析构函数执行析构操作
  2. 调用delete释放内存

此时,如果直接调用系统自带的delete,则打印完"~A(2) called"程序直接挂掉了,可见,默认的delete是调用free来释放内存的(本例中a的内存是建立在g_num上的,故free(a)时也free了g_num,从而导致程序挂了)。

原文链接: https://www.cnblogs.com/wangkangluo1/archive/2011/08/06/2129611.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++的new和delete功能小窥

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/30024

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午7:24
下一篇 2023年2月8日 上午7:24

相关推荐