最小化GC支持(n2670)仅意味着包括像std::declare_reachable
这样的函数,并定义了“安全派生指针”的含义,因此某些操作,如异或指针值变得未定义行为,而GC不需要担心它。另请参见Bjarne Stroustrup的有关GC ABI的C++11 FAQ和n2585:垃圾回收和基于可达性的泄漏检测的最小支持。
该提案允许在C++11框架内实现GC。但是,该提案本身并不意味着实现需要支持GC。一些库,如libc++,只需将库函数实现为无操作。
我相信,在这一点上,你的情况下内存只是泄漏了。但请注意,析构函数确实不需要在GC发生时运行。假设“§3.8对象生存期”也适用于GC指针,则我们有(§3.8 / 4):
…对于具有非平凡析构函数的类类型对象,在释放或重新使用所占用的存储之前,程序不需要显式调用析构函数; 但是,如果没有显式调用析构函数或者没有使用delete表达式(5.3.5)释放存储,则析构函数不得被隐式调用,并且任何依赖于析构函数产生的副作用的程序都具有未定义行为。
因此,也有可能在没有调用析构函数的情况下已经释放了内存。事实上,早期的GC提案,如n2310:透明程序员指导的C++垃圾收集显式声明(n2310 §7)
当对象被垃圾收集器回收时,它的析构函数不会被调用(当然,显式删除总是会调用析构函数)。
foo->~MyClass(); delete foo;
。在 GC 的情况下,可以合理地假设 GC 运行就像使用delete
表达式一样 - 在这种情况下,GC 负责调用析构函数。 - Eponymous