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