今天碰到一個問題,調試了很久,結果發現是類的指標的誤用,以及對於類的指標和類的對象的理解模糊,真是越基礎的東西,越容易產生問題啊,要牢記教訓!
問題描述:
我的工程中有一個公用類,定義了一些共用的方法,假設為Class Share。
在Class A中,我聲明了一個Share指標,Share *share,執行到A類中的一個函數,便直接通過share->去調用Class Share中的函數,在此函數中又調用了Class B(Class B中也聲明了一個Share指標,Share *share)中的一個函數,而且此函數中也要通過share->去調用,這樣就出現問題了,編譯沒錯,執行不通過,斷點就在B類中的那個函數的share處,PS:linux下面提示Segmentation fault(段錯誤),實際上就是記憶體訪問出錯。
這裡犯了三個錯誤:
1)在聲明類指標時一定要對指標進行初始化,不然會成為野指標,直接去調用函數肯定會出問題;
2)因為前一個指標調用完之後沒有釋放,一直在記憶體中存在,所以後面再次聲明同名指標必然導致記憶體訪問錯誤;
3)不應該聲明類指標去調用類中的方法,應該聲明對象,類指標多用於多態的實現,指標時間接訪問對象。
下面是對類對象及類指標的區別的整理:
類的指標:他是一個記憶體位址值,他指向記憶體中存放的類對象(包括一些成員變數所賦的值).
對象:他是利用類的建構函式在記憶體中分配一塊記憶體(包括一些成員變數所賦的值).
在應用時:
1.引用成員: 對象用" . "操作符; 指標用" -> "操作符.
2.生命期: 若是成員變數,則是類的解構函式來釋放空間;若是函數中的臨時變數,則範圍是該函數體內.而指標,則需利用delete 在相應的地方釋放分配的記憶體塊.
注意:用new ,一定要delete..
類的對象:用的是記憶體棧,是個局部的臨時變數.
類的指標:用的是記憶體堆,是個永久變數,除非你釋放它.
當類是有虛函數的基類,Func是它的一個虛函數,則調用Func時:
類的對象:調用的是它自己的Func;
類的指標:調用的是分配給它空間時那種類的Func;
對於一個類的對象和這個類的指標(用new運算子分配記憶體)在應用時有何區別
1.類和對象是兩回事,對象是類的執行個體;
2.對象是在棧中分配的,使用new產生的對象是在堆中分配的;
3.要發揮虛函數的強大作用,必須使用指標來訪問對象.
指標可以實現多態,直接用對象不行
執行定義對象,在棧空間
new處的在堆
注意名字的類型.
一個是Student
一個是Student*
Student是直接存取一個對象
Student*是間接訪問一個對象,因為通過了一個指標作媒介.
類型決定了你能做什麼.
其實作用基本一樣 都是為了調用類的成員變數 和成員函數用的
當你希望明確使用這個類的時候,最好使用對象,如果你希望使用C++中的動態綁定,則最好使用指標或者引用
指標和引用用起來更靈活,容易實現多態等
C++的精髓之一就是多態性,只有指標或者引用可以達到多態。對象不行
用指標:
第一實現多態。
第二,在函數調用,傳指標參數。不管你的對象或結構參數多麼龐大,你用指標,傳過去的就是4個位元組。如果用對象,參數傳遞佔用的資源就太大了。