如何在VC ++ 2013中使用Minimal GC?

时间:2013-09-14 10:41:37

标签: c++ visual-c++ memory-management c++11 garbage-collection

根据here,VC ++ 2013支持Minimal GC。

你们可以给我一些例子来说明它的用法吗?

换句话说,使用VC ++ 2013,如何使用GC?

我想要的代码示例可能如下所示:

auto p = gcnew int;

有没有?

1 个答案:

答案 0 :(得分:6)

你可能对C ++ 11中的Minimal GC感到失望:它不做垃圾收集! C ++ 11中的最小垃圾收集支持由两部分组成:

  1. 有一个强制要求“隐藏”每个人的指针。当你有一个指针时,你不允许混淆这个指向系统的指针,例如,通过将它写入稍后要读取的文件,或者通过使用xor-trick创建双向链表而只存储一个指针。标准说明了安全派生的指针(相关条款是3.7.4.3 [basic.stc.dynamic.safety])。
  2. 标准C ++库提供了一组接口,可用于识别无法跟踪可访问的指针,或者一旦它们不再可以这样说的话。也就是说,您可以定义一组被认为可用的根对象,不应被任何垃圾收集系统视为已释放。
  3. 然而,实际上没有任何标准化的实际利用这些设施。仅仅因为没有标准,这并不意味着当然不会使用作​​为接口的承诺。

    上面概述的API的相关功能在20.6.4 [util.dynamic.safety]中定义,要包含的标题是<memory>。这些功能简要说明:

    1. void std::declare_reachable(void* p)声明如果p是非空指针,p是可到达的对象,即使垃圾收集器已确定它不是。该函数可以分配内存,因此抛出。
    2. template <typename T> T* std::undeclare_reachable(T* p)声明如果p是非空指针,则p不再可访问。拨打undeclare_reachable(p)的次数不得超过使用相同指针调用declare_reachable(p)的次数。
    3. void std::declare_no_pointers(char* p, size_t n)声明从n开始的p字节的范围不包含任何指针,即使垃圾收集器已经确定会有内部指针。
    4. void std::undeclare_no_pointers(char* p, size_t n)撤消从n开始p个字节中没有指针的声明。
    5. 如果实现具有严格指针安全性,则
    6. std::pointer_safety std::get_pointer_safety() noexcept返回。
    7. 认为所有这些函数基本上都可以实现什么都不做,并返回默认值或指定返回类型的参数。这些函数的指针是有一个可移植的系统来通知垃圾收集器有关指针的信息,可以考虑可达和不跟踪的内存区域。

      将来可能会增加某种程度的垃圾收集,或者更可能是垃圾收集,但我不确定桌面上是否有具体的提案。如果它被添加的东西,它可能被称为垃圾收集,因为它实际上不会清理所有垃圾:垃圾收集只会回收无法访问的对象的内存,但尝试毁灭物体!也就是说,系统会给出一个无限期生命对象的视图,尽管它可以重用它所在的内存。