靜態創建和動態創建對象的區別


一.區別介紹

靜態創建對象指的是在棧上創建對象,比如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少做了構造)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM