Ada*_*eed 26 c++ garbage-collection visual-studio-2010 visual-c++ c++11
我一直在浏览和使用C++ 11的不同功能,特别是在Visual Studio 2010中.
提到的一件事是最小的垃圾收集:
根据这篇博客文章,VC10支持此功能.
我的测试显示析构函数不会被丢失的对象调用,所以我不确定他们的内存位置是否已被释放或是否泄漏.
我无意以任何方式依赖它,但无法找到关于其行为的直接,明确的答案.
ken*_*ytm 37
最小GC支持(n2670)仅表示std::declare_reachable包含的函数,并定义"安全派生指针"的含义,因此使某些操作(如异或指针值)成为未定义的行为,GC不需要担心关于它.另请参阅Bjarne Stroustrup关于GC ABI的C++ 11常见问题解答,以及n2585:对垃圾收集和基于可达性泄漏检测的最小支持.
该提案允许GC在C++ 11的框架内实现.但该提案本身并不意味着实施需要支持GC.一些库,例如libc ++,只是将库函数实现为no-op.
我很确定,在这一点上,你案件中的记忆只是泄漏了.但请注意,当GC发生时,析构函数确实不需要运行.假设"§3.8对象生命周期"也提供给GC-ed指针,我们有(§3.8/ 4):
...对于具有非平凡析构函数的类类型的对象,程序不需要在重用或释放对象占用的存储之前显式调用析构函数 ; 但是,如果没有显式调用析构函数或者如果没有使用delete-expression(5.3.5)来释放存储,则不应该隐式调用析构函数,并且任何程序都依赖于析构函数产生的副作用有未定义的行为.
因此,在没有调用析构函数的情况下,也可以释放内存.实际上,早期的GC提案如n2310:C++的透明程序员定向垃圾收集明确指出(n2310§7)
当一个对象被垃圾收集器回收时,它的析构函数不会被调用(当然,显式删除总是调用析构函数).