c++11標準 GC(垃圾回收)是否會使老代碼產生未定義行為?

這是一些關於GC標準的介紹……

http://www.stroustrup.com/C++11FAQ.html#gc-abi

比如下面的簡單示例

int *p=new int;
++p;//然後沒有指針指向上一句new出來的int,按照c++11標準,編譯器可以生成代碼來回收那些內存
*--p=1024;//按照c++11標準,這是未定義行為

老的代碼可能以不安全的方式使用指針。在某些底層庫中,由於一些指針總是對齊4位元組或8位元組,它們的最低bit一定是0,那就可以拿來存儲一個bool類型,可以節省空間。

然而在c++11標準引入GC後,如果老的代碼沒有使用

std::declare_reachable(void*);

而默認一切內存不由代碼明確調用釋放便一直可訪問,代碼的可靠性如何?

(我該如何禁用這個特性?我想每次new都declare_reachable,而且我不明確它可能以怎樣的原理實現,又會對效率造成什麼影響。)


那個東西叫minimal GC support,根本不是什麼GC,是用來實現GC的東西。

再說這玩意兒也沒人真的實現了啊,你愁什麼?


幾乎沒有編譯器實現了這個提案,放心


Proposal在這裡N2670: Minimal Support for Garbage Collection and Reachability-Based Leak Detection (revised) 。注意,這是Minimal Support for Garbage Collection,不是GC。這是為以後的GC鋪路的,定義一些行為未定義的情況,而不是真正實現了GC的功能。

而且,目前msvc/gcc/clang/icc都沒實現這個,你不用擔心。


自己不管內存,那玩c++還有什麼意思


第一,沒有人實現了這個東西

第二,你給的這段代碼,++p本身就是未定義行為(或者說依賴於實現)——C++只規定獲取對象、對象成員和數組元素的指針和數組尾後指針是合法的,p原來指的是對象int,++p之後得到的是對象後一個空間的地址,這個地方又不是數組尾後位置,所以不合法,B.S.可能沒注意到這一點


c++標準沒有規定GC,只是規定了GC的介面。如果你要使用GC,那就應該放棄老代碼,規避不安全的指針運算。

指針運算在BoehmGC里也是大概率玩脫,沒太大差別。允許細粒度控制是否使用GC(operator new (GC))倒是非常有趣的設計。


我覺得這個標準恐怕永遠不會有人去實現。而且我相信正常心智的C++程序員不會喜歡自動GC,那跟指針的設計是衝突的,而且嚴格的內存管理和生命周期本來就是C++的精髓之一。而且標準下面貌似就有個可以關掉的介面,雖然應該是要關必須整個程序都關掉吧。


移動一下指針,這個最小垃圾回收的支持就失效了。

如果真的在工程里用了這個,會讓工程變成垃圾吧。


不建議使用這種特性,智能指針挺好的,善用智能指針,事半功倍


誰說cpp有gc?


推薦閱讀:

一個人基於OpenJDK實現GC的concurrent compact部分,以減少GC停頓,困難嗎?
JVM堆內存很富足時,為什麼經常連續發生兩次full GC?
CMS GC發生concurrent mode failure時,為什麼使用單線程的full GC?
JVM full GC的奇怪現象,求解惑?

TAG:C | GC垃圾回收計算機科學 | C11 |