2015-01-01 178 views

回答

8

斯特勞斯在他C++ FAQ擴展了這個討論,事情是,GC的使用是可選的,庫供應商可以自由地實現一個或不:

垃圾收集(的 內存未引用地區的自動回收)是可選 in C++;也就是說,垃圾收集器不是實現的必需部分。然而,C++ 11提供了什麼,如果一個使用和ABI(應用 二進制接口),以幫助控制其動作的GC可以做 定義。

爲指針和壽命的規則在「安全 衍生指針」(3.7.4.3)來表示;大致爲:「指向由新的或其子對象分配的 的指針。」 到普通人:[...]

在C的功能++標準支持這個( 「接口」,其Stroustrup的所指的)是:

這些功能都在the N2670 proposal

其目的是爲了同時支持垃圾收集的實現和 基於可達性泄漏檢測器。這是通過給未定義 行爲程序,「隱藏指針」進行的,例如,異或它 與另一個值,再後來把它放回普通 指針並取消對它的引用。這樣的程序可以目前生產 用保守的垃圾收集器不正確的結果,因爲只有通過這種「隱藏指針」中引用的 對象可以是過早 收集。出於同樣的原因,基於可達性的泄漏檢測器可能會錯誤地報告此類程序泄漏內存。

無論您實現支持「嚴格的安全指針」在這種情況下實施GC是可能的,或者它有一個「寬鬆的指針安全」(默認),在這種情況下,事實並非如此。如果可用,您可以通過查看std::get_pointer_safety()的結果來確定。

我不知道任何實際的標準C++ GC實現,但至少該標準正在爲其發生準備

6

除了我提出的quantdev的好回答之外,我想在這裏提供更多的信息(這不適用於評論)。

這裏是一個C++ 11符合程序,其演示了一個實現是否支持GC接口:

#include <iostream> 
#include <memory> 

int 
main() 
{ 
#ifdef __STDCPP_STRICT_POINTER_SAFETY__ 
    std::cout << __STDCPP_STRICT_POINTER_SAFETY__ << '\n'; 
#endif 
    switch (std::get_pointer_safety()) 
    { 
    case std::pointer_safety::relaxed: 
     std::cout << "relaxed\n"; 
     break; 
    case std::pointer_safety::preferred: 
     std::cout << "preferred\n"; 
     break; 
    case std::pointer_safety::strict: 
     std::cout << "strict\n"; 
     break; 
    } 
} 

的輸出:

relaxed 

意味着實現具有微不足道實施什麼都不做。

的libC++輸出:

relaxed 

VS-2015輸出:

relaxed 

GCC 5.0輸出:

prog.cc: In function 'int main()': 
prog.cc:10:13: error: 'get_pointer_safety' is not a member of 'std' 
    switch (std::get_pointer_safety()) 
      ^
相關問題