• 静态创建和动态创建对象的区别


    一.区别介绍

    静态创建对象指的是在栈上创建对象,比如A a;它会在对象的作用域结束后自动销毁.

    动态创建对象指的是在堆上创建对象,然后栈上的指针指向创建的对象.比如A *pa = new A();它需要程序员手动delete掉.如果不进行delete操作,只能等到程序结束后,由OS来回收掉.

    代码说明:

    #include <iostream>
    using namespace std;
    
    class Programmer
    {
    public:
        int m_nAge;
        string m_sLanguage;
    
        Programmer(int nAge, string sLanguage)
        {
            m_nAge = nAge;
            m_sLanguage = sLanguage;
        }
    
        Programmer()
        {
            cout << "Ctor" << endl;
        }
    
        ~Programmer()
        {
            cout << "Dtor" << endl;
        }
    };
    
    int main()
    {
        //定义在栈上的对象
        Programmer pro(27, "C++");
    
        //定义在堆上的对象
        Programmer * pPro = new Programmer(27, "C++");
        delete pPro;
        return 0;
    }

    二.动态创建对象的好处

    上面的例子,我们会有一个疑问,静态创建感觉比动态创建简单,而且效果是一致的,为何还要进行动态创建呢?

    其实如果进行返回临时对象的指针操作时,你就能够发现问题了.

    两个函数都是返回对象的指针,前者是在栈上定义的对象proTemp,它在出了函数作用域后,会被销毁掉.那么返回的&proTemp指向的对象就不存在了,就变成了一个野指针.这样就会出现问题.

    而后者对象是在堆上创建的,就不会存在这个问题.不过记得要及时释放掉对应的内存哦.

    //class类中 
        
        Programmer * GetProgrammer(int nAge, string sLanguage)
        {
            Programmer proTemp = Programmer(nAge, sLanguage);
            return &proTemp;
        }
    
        Programmer * GetProgrammerNew(int nAge, string sLanguage)
        {
            Programmer *proTemp = new Programmer(nAge, sLanguage);
            return proTemp;
        }
    //main函数中
    //返回局部对象的指针 //因为所指向的对象已经销毁,所以返回的指针是野指针(所指向的爸爸没了) Programmer * pProTemp = pro.GetProgrammer(27, "C++"); cout << "age:" << pProTemp->m_nAge << endl; cout << "Language:" << pProTemp->m_sLanguage << endl; //返回堆上对象的指针 Programmer * pProTempNew = pro.GetProgrammerNew(27, "C++"); cout << "age:" << pProTempNew->m_nAge << endl; cout << "Language:" << pProTempNew->m_sLanguage << endl;
    delete pProTempNew;

    文章参考: C++中栈和堆上建立对象的区别 (malloc那块可以不用细看,知道malloc比这new少做了构造)

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    30流的使用和分类
    使用EF Model First创建edmx模型,数据库有数据的情况下,如何同时更新模型和数据库
    29防止程序集被篡改仿冒,全局程序集缓存GAC
    报错:不允许保存更改。您所做的更改要求删除并重新创建以下表……
    28先判断是否存在,再创建文件夹或文件,递归计算文件夹大小
    27程序集资源
    MVC缓存02,使用数据层缓存,添加或修改时让缓存失效
    26复杂类型比较,使用Compare .NET objects组件
    25LINQ拾遗及实例
    MVC缓存01,使用控制器缓存或数据层缓存
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/12692547.html
Copyright © 2020-2023  润新知