C ++(14)和手动内存管理

时间:2014-03-07 13:04:02

标签: c++ memory-management c++14

我刚收到评论,比如

  

问题是手动内存管理。 delete在用户代码中没有位置,从C ++ 14开始,也没有new

有人可以解释一下为什么吗?

3 个答案:

答案 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_sharedstd::make_unique,因为当应用程序抛出异常等时,处理new/delete等更容易出错。

智能指针在使用时自动删除(使用RAII),即使抛出异常也不像新的/删除可能会泄漏内存

有关详细信息,请参阅thisthis

答案 2 :(得分:-1)

引用的声明中唯一指出的是这个人 谁说它并不真正了解程序设计或方式 C ++工作(以及在C ++中使用动态内存的方式)。该 语句定义了反模式,而不是其他任何东西。

特定类型的应用程序 适用;我目前工作的应用程序是一个。但 它不是一般的,在我工作的大多数应用程序中 在过去,大多数删除都在用户代码中。 (那些 那些不是像std::vector这样的基本课程。)