加速C++:我能用智能指针替换裸指针吗?

4

我喜欢这本书,但遗憾的是它没有涵盖智能指针,因为当时它们不是标准的一部分。那么在阅读这本书时,我可以公平地用智能指针或引用替换每个提到的指针吗?


5
这本书中有没有一个具体的程序例子会受益于使用智能指针?指针在书中出现了一半多一点,大部分使用指针的程序是为了说明如何自己管理它们,主要是通过实现Vec类(有效地介绍了三个法则)和讨论句柄类来完成的(用于动态分配资源的句柄类基本上就是一个智能指针)。我想知道您认为何处可以受益于使用智能指针(我最近没有读过这本书)。 - James McNellis
@james-mcnellis 我同意,我到目前为止还没有读过这本书,这只是一个预防性的问题。 - BrokenClockwork
1
好的,那么在阅读这本书的时候,您不必担心智能指针。一旦您阅读完这本书,就应该很容易理解所有Boost智能指针以及它们的工作原理以及何时应该使用它们:《Accelerated C ++》提供了非常详尽的处理类说明,应该帮助您理解正确的生命周期管理。 - James McNellis
3个回答

4
"智能指针"这个词有点误导性。 "智能"的部分是它们会为您做一些事情,无论您是否需要、想要或甚至理解那些事情是什么。 这非常重要。 因为有时候你会想去商店,而智能指针会把你带到教堂。 智能指针解决了一些非常具体的问题。 许多人认为,如果你认为你需要智能指针,那么你可能正在解决错误的问题。 我个人不想站队。 相反,我使用工具箱比喻-您需要真正理解您要解决的问题以及您可以使用的工具。 只有这样,您才能远程预期选择适合工作的正确工具。 祝好运,并继续质疑!

2

好的,智能指针有不同种类。例如:

你可以创建一个scoped_ptr类,在代码块中分配任务时非常有用,当作用域结束时,资源会被自动释放。

类似这样:

template <typename T>
class scoped_ptr
{
 public:
    scoped_ptr(T* p = 0) : mPtr(p) {}
    ~scoped_ptr() { delete mPtr; }
 //...
};

此外,您可以创建一个shared_ptr,它的作用相同,但保留了引用计数。一旦引用计数达到0,您将进行解除分配。 shared_ptr对于存储在STL容器等中的指针非常有用。
因此,是的,您可以为程序的大多数目的使用智能指针。但是,请明智地考虑您需要哪种类型的智能指针以及原因。
不要简单地“查找和替换”您遇到的所有指针。

3
同时,虽然创建自己的智能指针很容易,但设计一个没有漏洞的智能指针却出奇地难。在过去的二十年中,我所参与的每个项目中都有他们自己的智能指针,而迟早会发现令人讨厌的漏洞。 - sbi
3
SBI:嗯,这只是为了演示而已。当然会缺少,所以才有//... - vdsf
“你需要正确地使用@地址回复评论,否则我们将无法在“响应”选项卡中看到它们。我只是偶然发现了这一个。”是的,但在设计和实现智能指针时,缺少一个非常重要的位置。 - sbi
@sbi:那不是实现,只是为了说明作用域机制。 - vdsf

2

编号。

代表对象所有权的指针应该被智能指针所取代。

其他指针应该被迭代器所取代(在最简单的情况下,迭代器只是一个原始指针的typedef,但没有人会认为它们需要删除)。

当然,智能指针和迭代器的实现代码仍将需要原始指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接