2015-01-01 123 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()) 
      ^
相关问题