標籤:

c++中在局部空間用new運算符創建的變數是否會被銷毀?

我根據自己的測試結果得知的是局部new創建的變數在脫離了局部空間後是無法用原先指向它的指針變數訪問的,這也是,原先指向它的指針變數在脫離局部空間後被銷毀了,但new的變數是否被銷毀了呢?

我的推測是沒有,我認為原因是其使用的是堆中的內存,並不是系統管理的棧中。

c++初學,若以上語句有錯誤望指正


不會,不過如果你覺得delete太煩,你可以把

auto fuck = new Fuck(a,b,c);

改成

auto fuck = make_shared&(a,b,c);

就會自動釋放了。


new創建出來的內存空間是不會被銷毀的,因為它是在堆上創建的。而指針變數是會被銷毀的,因為它是在棧上創建的。

這是一種常見的內存泄露的情況。盡量避免手動管理指針,採用c++11中的shared_ptr和unique_ptr來管理。


new出來的指針需要你自己手工管理。指針本身的生命周期跟指針指向的東西的生命周期是獨立的。

如果你覺得不爽,可以考慮用C++11的std::unique_ptr,這時候行為會變成指針本身會在自己銷毀的時候同時把指向的東西銷毀。

當然還有一個選項就是 @vczh 提到的std::shared_ptr,這個允許這個指針被複制,然後會在指針的所有複製都銷毀(或者說還剩下0個指針副本)的時候把被指向的對象銷毀。(weak_ptr我就不仔細說了……提一下這個東西存在你自己去看就好了)


你是對的,不會銷毀,new出來的都是指針,這是c系語言中指針的基本特徵


不會。new的是堆中的一塊空間,棧中的指針變數指向這塊空間。指針變數過了作用域,不再指向堆空間。這塊堆空間就泄露了。所以在指針變數過期前,一定要通過它將堆空間釋放掉(delete).剛開始是有點不好理解…看得多了就清楚了,加油!


new 出了的是有對象的空間不是變數。。 p=new foo表示你new出來了一個在堆上的新的foo對象,對象的地址賦給了p,至於p能不能在外邊訪問,跟這個new沒有關係,得看你p是怎麼來的。。。比如你p是外面建立的,傳了個引用進來當然在外邊能訪問,或者你本來p就是在堆上的也是能訪問的


這就是傳說中的內存泄漏。

C++11里引入了智能指針(輪子哥回答里的那個make_shared),可以自動銷毀內存,你可以查一下。


在堆上的內存是不會被自動回收的。

如果是在一個函數里new出來的一塊內存,在這個函數內沒有delete掉的話,基本上都會返回一個指向這塊內存的指針,要不然就內存泄露了。


我原以為我的c++是最爛的。

看到樓主我也是小自信了一回。謝謝你。

我要好好學哈哈。


推薦閱讀:

c++怎麼檢測內存泄露,怎麼定位內存泄露?
為什麼我覺得 Objective-C 的內存管理比 C++ 要複雜得多?這類語言是否是趨勢?
C++局部靜態變數的內存什麼時候創建的?
C++允許「我們都是人,所以我可以把你私有的眼睛借來隨便玩,再還給你」,這難道是一種設計上的妥協?
visual studio和gdb的調試機制到底是怎麼樣的?

TAG:編程 | C |