是否有理由在C++11/14中仍然使用原始指针(用于托管资源)?
类中的资源成员变量是否应该保存在自己的智能指针中,用于自动RAII,而不需要析构函数中的清理?
智能指针的实现是否内联为这样做没有开销?
发布于 2014-06-25 16:50:00
是否有理由在C++11/14中仍然使用原始指针(用于托管资源)?
我认为“管理资源”指的是“拥有的资源”。
是的,理由如下:
类中的资源成员变量是否应该保存在自己的智能指针中,用于自动RAII,而不需要析构函数中的清理?
在最好的情况下,资源成员变量应该只是成员,而不是明显的指针,甚至不是智能指针。智能指针是代码操作原始指针和纯RAII样式之间的“桥梁”。如果您完全控制了一些代码,并且它是新代码,则完全可以避免在您的接口中使用任何智能指针。不过,您可能在实现中需要它们。请记住,没有实际的规则,只有关于如果您
智能指针的实现是否内联为这样做没有开销?
标准智能指针的实现是尽可能高效的,所以是的,它们的大部分代码都是内联的。然而,他们并不总是自由的,这取决于他们到底做了什么。例如,几乎在所有情况下,unique_ptr都是一个原始指针,只需对其使用地点进行额外检查。所以它是“免费的”。另一方面,shared_ptr必须维护有多少其他shared_ptr引用同一个对象的计数器。该计数器可以在多个执行shared_ptr副本的线程上更改,因此它必须是原子的。更改原子计数器的值并不总是免费的,您应该始终假定,与复制原始指针相比,存在更高的成本。
所以“视情况而定”。
只是:
从用户的角度来看,您将以代码结束,这些代码似乎不操作指针。如果您有几层代码遵循这些规则,代码将更容易遵循和高度可维护。
关于“When to use references vs. pointers”的相关说明
避免指针,直到你不能。
还要注意的是,肖恩的父母在他最近的谈话中也认为智能指针是原始指针。它们确实可以封装为价值语义类型的实现细节,与实际操作的概念相对应。此外,在实现中使用类型擦除技术,但从不向用户公开它们有助于某些库结构的可扩展性。
发布于 2014-06-25 16:42:32
那得看情况。如果该对象是由另一个对象完全拥有、构造和销毁的,那么在另一个对象中使用std::unique_ptr是一个很好的理由。如果您有一个拥有多个此类对象的对象,所有这些对象都在构造函数中动态分配,那么您必须做一些事情;如果通常的智能指针的语义不合适(通常是这样),那么您就必须发明一些东西:例如,在图的情况下,您可以将根指针放在基类中(将其初始化为null),并让基类的析构函数从根开始清理图形。
当然,除非您的类具有某种动态结构(如图),否则您可能会问自己为什么要首先使用动态分配。有一些特殊情况(例如,拥有的对象是多态的,其实际类型取决于构造函数的参数),但在我的经验中,它们并不常见。实际上,在很多情况下,智能指针可以在对象中使用,更不应该使用。
发布于 2014-06-25 16:43:29
RAII不仅仅是结束新的和删除--智能指针是RAII的一种形式,但是RAII不仅仅是这样。RAII的一个好选择是,当您拥有任何类型的镜像功能时:新/删除、初始化/拆卸、停止/启动。因此,您的资源仍然应该有自己的RAII类--一个在自己的析构函数中执行清理功能的类。
https://stackoverflow.com/questions/24413976
复制相似问题