zoukankan      html  css  js  c++  java
  • C++的new和delete功能小窥

    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;}

        void* operator 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,从而导致程序挂了)。

  • 相关阅读:
    丰清杨 作业 160809315
    自学C++游戏程序开发学习顺序(转)
    哈佛幸福课相关&积极心理学经典英文原版书籍读书笔记(连载中)(转)
    程序员追求的是什么?
    如何学好游戏编程?
    计算机专业的学生必须掌握的五门课程
    [译]学好数学能让程序员的水平更高
    天下没有免费的午餐
    各个类型书籍推荐
    Peter Norvig:自学编程,十年磨一剑
  • 原文地址:https://www.cnblogs.com/TianFang/p/970446.html
Copyright © 2011-2022 走看看