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

xml*_*lmx 2 c++ garbage-collection memory-management visual-c++ c++11

根据这里,VC++ 2013支持Minimal GC.

你们能举一些例子来说明它的用法吗?

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

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

auto p = gcnew int;
Run Code Online (Sandbox Code Playgroud)

有吗?

Die*_*ühl 6

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

  1. 有一个强制要求不要"隐藏"每个人的指针.当你有一个指针时,你不允许将这个指针混淆到系统,例如,通过将它写入一个文件以便稍后读取,或者通过使用xor-trick创建一个双向链表而只存储一个指针.标准说明了安全派生的指针(相关条款是3.7.4.3 [basic.stc.dynamic.safety]).
  2. 标准C++库提供了一组可被用来标识不能被跟踪为指针接口可达或,一旦它们不再可到达这么说.也就是说,您可以定义一组被认为可用的根对象,不应被任何垃圾收集系统视为已释放.

然而,实际上没有使用这些设施的标准化.仅仅因为没有标准,它并不意味着当然不使用作为接口的承诺.

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

  1. void std::declare_reachable(void* p)声明if if p是非空指针p是可达对象,即使垃圾收集器已经确定它不是.该函数可以分配内存,因此抛出.
  2. template <typename T> T* std::undeclare_reachable(T* p)声明if 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. std::pointer_safety std::get_pointer_safety() noexcept返回如果实施有严格的指针安全.

认为所有这些函数基本上都可以实现什么都不做,并返回默认值或指定返回类型的参数.这些函数的指针是有一个便携式系统,用于通知垃圾收集器有关可以考虑可达的指针和不要跟踪的内存区域.

将来可能会增加一些垃圾收集级别,或者更可能是垃圾收集,但我不确定桌面上是否有具体的提案.如果它被添加的东西,它可能被称为垃圾收集,因为它实际上不会清理所有垃圾:垃圾收集只会回收无法到达的对象的内存,但不会试图破坏对象!也就是说,系统会给出一个无限期生存对象的视图,尽管它可以重用它所在的内存.