• new/delete 和malloc/free 的区别(代码部分)


    原理部分可以参见别人的博文

    http://www.cppblog.com/Lee/archive/2009/03/09/75990.html

    声明:

    //NewDelete.h
    #ifndef _NEWDELETE__H_
    #define _NEWDELETE__H_
    void TestMallocFree();
    void TestNewDelete();
    void TestNew();
    #endif

    实现:

    View Code
    //NewDelete.cpp
    #include <stdio.h>
    #include <malloc.h>
    class CObject
    {
    public:
    CObject(){
    printf("Destruct0\n");
    }

    ~CObject(){
    printf("ConDestruct0\n");
    }

    void Init(){
    printf("ConDestruct\n");
    }
    void Destroy(){
    printf("ConDestruct\n");
    }
    };

    class CMultDestruct
    {
    public:
    static int c_destruct;
    int m_dat;
    CMultDestruct():m_dat(0)
    {
    c_destruct++;
    printf("没有参数的构造函数,destruct cnt:%d\n",c_destruct);
    }
    CMultDestruct(int a):m_dat(0)//先执行初始化列表,后执行函数体
    {
    c_destruct++;
    m_dat = a;
    printf("带参数的构造函数:m_dat:%d,inpara:%d,destruct cnt:%d\n",m_dat,a,c_destruct);
    }
    };
    int CMultDestruct::c_destruct = 0;

    void TestMallocFree()
    {
    CObject* pObject = (CObject*)(malloc(sizeof(CObject)));
    pObject->Init();
    pObject->Destroy();
    free(pObject);
    }

    void TestNewDelete()
    {
    CObject* pObject = new CObject;
    delete pObject;
    }

    void TestNew()
    {
    //无参数的构造
    CMultDestruct* p1= new CMultDestruct();

    //带参数的构造
    CMultDestruct* p2= new CMultDestruct(1);

    //数组的构造和析构
    CMultDestruct* ps1= new CMultDestruct[5];
    delete []ps1;

    //CMultDestruct* ps2= new CMultDestruct[5](1);//错误 编译不过去
    CMultDestruct* ps3[]= {new CMultDestruct(1),new CMultDestruct(2),new CMultDestruct(3),new CMultDestruct(4),new CMultDestruct(5)};
    //delete []ps3;//错误,正确的做法如下
    for(int i=0;i<sizeof(ps3)/sizeof(ps3[0]);i++)
    {
    delete ps3[i];
    }

    //依靠操作系统的实例,缺点是只能在函数声明周期结束后才能被回收内存
    CMultDestruct pImp;
    CMultDestruct pImp2 = CMultDestruct(1);

    //静态类的实例
    static CMultDestruct sImp = CMultDestruct(1);
    }

    示例代码:

        printf("动态内存申请:\n");
    TestMallocFree();
    TestNewDelete();
    printf("测试类的内存申请:\n");
    TestNew();

    运行结果:





  • 相关阅读:
    2010年8月26日周四_understanding ArcGIS Server_overview_8.1
    2010年8月23日周一_FeatureLayer_6.13
    2010年8月22日周日_StylingAndSkinningScaleBar_6.12
    2010年8月26日周四_underStanding Flex_FlexComponets_7.4
    Flex组件的项目渲染器(ItemRenderer)使用总结
    2010年8月26日周四_understanding Flex_componentsLifeCycle_7.5
    2010年8月26日周四_understanding Flex_MXML and ActionScript_7.2
    缺页中断
    后缀式
    lua continue
  • 原文地址:https://www.cnblogs.com/RealOnlyme/p/2408023.html
Copyright © 2020-2023  润新知