为什么c++ 11允许GC ?
Why does C++11 allow for GC?
c++ 11允许其实现执行(一些)垃圾收集实用程序。为什么标准会允许这样呢?我一直有这样的印象:在c++中,不用为不用的东西付费。对我来说,(隐含的)GC似乎破坏了这种意识形态。此外,在c++中通过智能指针编写和使用显式垃圾收集实用程序并不困难。
第二,GC会使一些原本有效的程序无效。示例包括指针屏蔽和相关的低级指针"hack"。
int * nums = new int[10];
nums += 2;
*nums = 777; // nothing points to the new'ed int[10] at this point
// oh no! nums could have gotten collected!!! (so lets assume it was)
*nums = 666; // crash (or memory corruption (or something else that's bad))
GC在c++ 11标准中不需要存在,但在未来的版本中可能会存在。
它不会被强加于你——它只会在你请求的时候出现。它不会收集你的普通指针,它不会收集当前的智能指针。所以,它仍然是"不要使用-不要为它付费"。它将只对你显式要求的指针工作,所以你的例子仍然会像现在一样工作。
参见Sutter 's Mill: Garbage Collection简介和c++
引用计数(#1)通常是最好的,它是c++的默认值GC的形式。但也有理由(而不是取而代之)想要懒惰标记-清除(#2)垃圾收集在c++中处理的东西计数无法处理,包括潜在循环的时间不可避免的(在某些情况下,某些对象可能会自然地被共享,但随后可能相互引用)和无锁ABA问题。
通过"引用计数",Sutter指的是std::shared_ptr
和类似的东西。
相关文章:
- 如何只允许用户输入正整数
- 控制允许动态运行c++的并发操作数
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 允许从 std::map 的密钥窃取资源?
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- Visual C++GC接口如何启用它以及要包含哪个库
- 为什么 Clang 不允许"and"作为函数名称?
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 在noexcept 规范中是否允许使用"this"?
- 返回时不允许隐式转换
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 对象初始化中是否允许指向此成员的指针?
- 如何允许大写和小写用户输入?
- 为什么函数声明中允许 const?
- 是否允许使用带有"w+"模式的 freopen 进行标准设置?
- 为什么c++ 11允许GC ?