在一個(gè)類中必定含有構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造函數(shù),以及拷貝賦值函數(shù)。
接下來(lái)先談下編寫這四個(gè)函數(shù)需要注意的地方
ctor(構(gòu)造函數(shù))和dtor(析構(gòu)函數(shù))
1)構(gòu)造函數(shù)傳入指針時(shí),如果有初值,new char[strlen(cstr) + 1];strcpy(m_data, cstr);
如果沒(méi)有初值,new char[1]; *m_data = '\0';//存放結(jié)束符
2)析構(gòu)函數(shù),new什么,就delete什么。
copy ctor(拷貝構(gòu)造函數(shù))
1)new char[strlen(cstr) + 1];strcpy(m_data, cstr);來(lái)源端和目的端都是本類
copy assignment operator(拷貝賦值函數(shù))
1)先清理目的端,才能賦值
2)需要判斷是不是自我賦值
if(this == &str) return *this;
Typename&--表示引用
&object--表示取地址
接下來(lái)談一談C++的內(nèi)存管理
內(nèi)存泄漏幾乎在每個(gè)C++程序中都會(huì)發(fā)生,所以內(nèi)存管理是學(xué)習(xí)C++ 的必經(jīng)之路。
在C++中,內(nèi)存分成5個(gè)區(qū),他們分別是堆、棧、自由存儲(chǔ)區(qū)、全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)。
棧:在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。
堆:就是那些由new分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應(yīng)用程序去控制,一般一個(gè)new就要對(duì)應(yīng)一個(gè)delete。如果程序員沒(méi)有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會(huì)自動(dòng)回收。
自由存儲(chǔ)區(qū):就是那些由malloc等分配的內(nèi)存塊,他和堆是十分相似的,不過(guò)它是用free來(lái)結(jié)束自己的生命的。
全局/靜態(tài)存儲(chǔ)區(qū):全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C語(yǔ)言中,全局變量又分為初始化的和未初始化的,在C++里面沒(méi)有這個(gè)區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。
常量存儲(chǔ)區(qū):這是一塊比較特殊的存儲(chǔ)區(qū),他們里面存放的是常量,不允許修改。
如果想要更詳細(xì)的了解C++的內(nèi)存管理,請(qǐng)參閱《C++內(nèi)存管理詳解》。
并且在現(xiàn)代C++編程中,智能指針給我們?cè)谫Y源管理上帶來(lái)了很多好處。
在工作中,我們常常會(huì)用智能指針來(lái)管理資源,其中最常用的就是引用計(jì)數(shù)類智能指針了(shared_ptr)。
資源共享型的智能指針有兩種實(shí)現(xiàn),一種是侵入式,一種是非侵入式。
如果希望詳細(xì)了解C++的智能指針,請(qǐng)參閱《C++引用計(jì)數(shù)計(jì)數(shù)及智能指針的簡(jiǎn)單實(shí)現(xiàn)》