我刚收到评论,比如
问题是手动内存管理。
delete
在用户代码中没有位置,从C ++ 14开始,也没有new
有人可以解释一下为什么吗?
答案 0 :(得分:37)
警告:我坚持这个答案,因为我认为它提供了一个最佳实践,可以改善约95%的C ++代码 - 可能更多。也就是说,请阅读完整的评论以讨论一些重要的警告。
因为这是我的评论,所以my presentation解释了这一点。
简而言之:
[原始]指针 必须。不。拥有。 资源。强>
它容易出错并且不必要,因为我们有更好的方法来管理资源,从而减少错误,缩短代码,提高代码可读性,并在代码正确性方面提高置信度。从经济角度来说:它们的成本更低。
就我所作的评论更具体:
从C ++ 11开始(现在已经有两年了,在所有现代编译器的相关部分中实现),手动删除内存是完全没必要的(除非你写非常低级别内存处理代码)因为你总是可以使用智能指针,而且通常甚至不需要它们(参见演示文稿)。但是,在实例化新的new
时,C ++ 11仍然要求您使用std::unique_ptr
。在C ++ 14中,函数std::make_unique
不需要使用new
。因此,它也不再需要了。
在代码中仍然存在可放置的位置 - new
,但这是(a)与普通new
完全不同的情况,即使语法相似,并且(b)可以在大多数情况下,使用allocator::construct
函数替换。
詹姆斯已经指出了这个规则的一个例外,我曾经诚实地忘记了:当一个物体管理自己的生命时。在大多数情况下,我会说这不是一个常见的习惯用法,因为对象的生命周期可以总是在外部进行管理。但是,在某些应用程序中,将对象与其余代码分离并让它自行管理可能是有益的。在这种情况下,您需要动态分配对象并使用delete this
解除分配。
答案 1 :(得分:3)
Smart pointers
反而应该使用std::make_shared
和std::make_unique
,因为当应用程序抛出异常等时,处理new/delete
等更容易出错。
智能指针在使用时自动删除(使用RAII),即使抛出异常也不像新的/删除可能会泄漏内存
答案 2 :(得分:-1)
引用的声明中唯一指出的是这个人 谁说它并不真正了解程序设计或方式 C ++工作(以及在C ++中使用动态内存的方式)。该 语句定义了反模式,而不是其他任何东西。
是特定类型的应用程序
适用;我目前工作的应用程序是一个。但
它不是一般的,在我工作的大多数应用程序中
在过去,大多数删除都在用户代码中。 (那些
那些不是像std::vector
这样的基本课程。)