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