在C#和Java中,在使用對象的時候一般都是通過New,我們知道通過new關鍵字實際上是在heap(堆中)開辟了一塊內存,而等號右邊的這個對象實際上就是一個內存地址,不信的話,可以打印出來看看。其實並不僅僅這么簡單。堆上分配的是不定大小的對象,大小不固定,而基本數據類型(int,short)什么的都在棧上,棧上對象的大小是固定的,堆上對象的引用也在棧上,如果堆上的對象在棧(stack)上沒有了引用,它就被GC回收了。在學OO開發的時候,老師一般都會苦口婆心的讓我們記住這些,這些也算是OO開發的基礎吧。
在C++的時候,跟這個不太一樣,我們知道C++不是完全的面向對象的,在C++中,對象和對象指針都會用到,但是兩者區別蠻大的。
C++中,使用new創建類對象需要指針接收,也就是對象指針,這種對象,當使用new的時候會在heap中開辟內存空間,然后將內存地址返回給對象指針變量,new了之后的對象,在不用的時候,一定要delete,也就是手動釋放,否則在程序退出的時候會有內存泄露。
- new創建類對象需要指針接收,一處初始化,多處使用
- new創建類對象使用完需delete銷毀
- new創建對象直接使用堆空間,而局部不用new定義類對象則使用棧空間
- new對象指針用途廣泛,比如作為函數返回值、函數參數等
而如果直接聲明類的變量,如:
CTest mTest;
此種創建方式,對象是被創建在棧上的,使用完后不需要手動釋放,該類析構函數會自動執行。
總結:
- new創建類對象需要指針接收,一處初始化,多處使用
- new創建類對象使用完需delete銷毀
- new創建對象直接使用堆空間,而局部不用new定義類對象則使用棧空間
- new對象指針用途廣泛,比如作為函數返回值、函數參數等
- 頻繁調用場合並不適合new,就像new申請和釋放內存一樣
最后推薦一篇博客:http://www.cnblogs.com/hellope/archive/2011/08/03/2126371.html,博客中用圖的方式說明了局部變量使用new和不使用new的區別。