一.区别介绍
静态创建对象指的是在栈上创建对象,比如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少做了构造)