问题标签 [smart-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
18748 浏览

c++ - C++ 使用 scoped_ptr 作为成员变量

只是想对一个设计问题发表意见。如果你有一个 C++ 类而不是其他对象,你会使用智能指针来实现这一点吗?

“拥有”对象不能按值存储,因为它可能会在对象的整个生命周期中发生变化。

我的观点是,一方面,您明确该对象是拥有的并确保将其删除,但另一方面,您可以轻松地拥有一个常规指针并在析构函数中将其删除。这是矫枉过正吗?

跟进:只是想对您的所有回答表示感谢。感谢您对 auto_ptr 在复制整个对象时为另一个对象留下一个 NULL 指针的提醒,我已经广泛使用了 auto_ptr 但还没有想到这一点。除非我有充分的理由,否则我基本上将所有课程都设为 boost::noncopyable,因此无需担心。还要感谢有关异常中内存泄漏的信息,这也很高兴知道。我尽量不在构造函数中写可能导致异常的东西——有更好的方法——所以这不应该是一个问题。

不过,我还有另一个问题。当我问这个问题时,我想知道是否有人真的这样做了,你们似乎都提到理论上这是一个好主意,但没有人说他们真的这样做了。这让我感到惊讶!当然,一个对象拥有指向另一个对象的指针并不是一个新想法,我原以为你们都曾在某个时候做过。这是怎么回事?

0 投票
9 回答
7236 浏览

c++ - 在 C++ 中实现智能指针的最佳方法是什么?

我一直在评估各种智能指针实现(哇,那里有很多),在我看来,它们中的大多数可以分为两大类:

1) 此类别对引用的对象使用继承,以便它们具有引用计数,并且通常实现 up() 和 down()(或它们的等价物)。IE,要使用智能指针,您指向的对象必须从 ref 实现提供的某个类继承。

2) 此类别使用辅助对象来保存引用计数。例如,智能指针不是直接指向一个对象,而是实际上指向这个元数据对象……谁有引用计数和 up() 和 down() 实现(并且谁通常提供指针指向的机制获取指向的实际对象,以便智能指针可以正确实现运算符->())。

现在, 1 有一个缺点,它强制您希望引用 count 的所有对象都从一个共同的祖先继承,这意味着您不能使用它来引用您无法控制源代码的 count 对象到。

2 的问题是由于计数存储在另一个对象中,如果您曾经遇到将指向现有引用计数对象的指针转换为引用的情况,您可能有一个错误(IE,因为计数不在实际对象,新引用无法获取计数...引用到引用复制构造或赋值很好,因为它们可以共享计数对象,但是如果您必须从指针转换,您重新完全冲洗)...

现在,据我了解, boost::shared_pointer 使用机制 2,或类似的东西......也就是说,我无法完全决定哪个更糟!我只在生产代码中使用过机制 1……有人对这两种风格都有经验吗?或者也许还有另一种比这两种方法更好的方法?

0 投票
3 回答
85670 浏览

c++ - 从shared_ptr 得到一个正常的ptr?

我有类似shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) 现在需要调用需要指向Type. 我如何从中得到它shared_ptr

0 投票
2 回答
1823 浏览

c++ - 发布/订阅和智能指针

我想实现一个简单的发布/订阅模式,其中:

单个发布者向其订阅者发布令牌(指向对象的指针)。发布者和订阅者都是独立的线程。我计划为每个订阅者添加线程安全队列,以便发布者可以在订阅者处理令牌时继续将令牌分发给订阅者。

如您所见,这意味着所有订阅者实际上共享相同的指针(注意:订阅者无论如何都不能修改指向的对象,所以没有问题)。一旦共享指针不再被任何订阅者使用,如果指针可以在最后一个订阅者线程完成后自动删除它自己,那就太好了。

这是使用智能指针的好地方吗?如果是这样,我应该使用哪些智能指针?

我在 Windows 上使用 MSVC2008 进行开发,并且正在使用 Intel TBB、Boost 和 Qt。

0 投票
3 回答
1790 浏览

c++ - 为智能指针编写复制构造函数时出现问题

我正在使用的代码有自己的智能指针实现,它执行简单的引用计数。是的,我们不应该有自己的实现。是的,我们应该使用 boost 中的一个或类似的。忍受我。

我发现我想写这样的代码:

但是,CountedPointer 的复制构造函数有一个这样的原型:

所以上面的代码无法编译,因为它找不到合适的构造函数(或赋值运算符 - 那里是同样的故事)。我尝试用这样的原型重写复制构造函数:

但是,我遇到了一个问题,即复制构造函数必须访问它正在复制的对象的私有成员(即原始指针),如果它位于不同的 CountedPointer 特化中,它们是不可见的。

Alexandrescu 在他的Loki库中通过封装指针的访问器函数避免了这个问题,但如果可能的话,我不希望直接访问原始指针。

有什么办法可以写这个来允许派生到基本副本,但不允许一般访问原始指针?

更新: 我已经实现了下面接受的答案,并且效果很好。当我只提供复制构造函数的模板版本,替换原始的未模板版本时,我花了一段时间弄清楚为什么我的程序会出现可怕的段错误。最终,我意识到编译器并不将模板版本视为复制构造函数,而是提供了一个默认版本。默认的只是愚蠢地复制内容而不更新计数器,所以我最终得到了悬空指针和双重释放。同样的事情也适用于赋值运算符。

0 投票
4 回答
92257 浏览

c++ - 智能指针(升压)解释

以下一组指针有什么区别?你什么时候在生产代码中使用每个指针,如果有的话?

示例将不胜感激!

  1. scoped_ptr

  2. shared_ptr

  3. weak_ptr

  4. intrusive_ptr

你在生产代码中使用 boost 吗?

0 投票
3 回答
1278 浏览

c++ - C++ 中带有“this”的智能指针

我一直致力于用引用计数指针替换原始指针,这些指针仅公开底层指针的 const 版本。我的目标是减少内存使用(以及不必要地构造和破坏复杂对象所花费的时间),而不会让自己陷入任何代码都可以访问它不拥有的内存的情况。我知道引用计数的循环引用问题,但我的代码不应该造成这种情况。

要求 const-ness 是可行的,因为我使用的系统中类通常不公开非 const 成员,而不是更改对象,您必须在其上调用一个方法,该方法返回由更改产生的新对象。这可能是一种设计模式,但我不知道它的名称。

当我有一个方法返回指向其类型对象的指针时,我的问题就出现了,有时它本身就是。以前它看起来像这样:

我看不到让它返回智能指针的好方法。天真的方法类似于return CRcPtr< Foo >( this ),但这会破坏所有权语义,因为我返回的内容以及以前拥有该对象的人现在都认为他们拥有所有权但彼此不了解。唯一安全的做法是return CRcPtr< Foo >( new Foo( *this ) ),但这违背了我限制不必要的内存使用的意图。

有没有办法在不分配任何额外内存的情况下安全地返回智能指针?我的怀疑是没有。如果有,如果对象已在堆栈上分配,它将如何工作? 这个问题似乎相关,但并不相同,因为他可以让他的函数将原始指针作为参数,并且因为他使用的是 boost 库。

作为参考,我的自制智能指针实现如下。我相信它可能会更强大,但它比依赖于任何地方都可用的 boost 或 tr1 更便携,并且在这个问题之前它对我来说效果很好。

编辑:感谢您的回复。我希望避免使用 boost 或 tr1,但我认识到不使用经过良好测试的库通常是不明智的。我相当确定我所实现的与 std::auto_ptr相似,而是与 tr1::shared_ptr 相似,只是它只公开了内部指针的 const 版本并且缺少正式版本中的一些功能。我真的很想避免像 Gian Paolo 提出的那种侵入式方案。我知道我的实现不是线程安全的,但这是一个单线程应用程序。

0 投票
7 回答
357 浏览

c++ - 帮助我使这段代码异常安全

所以我有这个库代码,看...

在我的客户代码中......

我坚持的是异常安全。就目前而言,如果任何 Obj 构造函数抛出,或者 Thing 构造函数抛出,已经在向量中的 Objs 将会泄漏。向量需要包含指向 Objs 的指针,因为它们被多态地使用。而且,我需要在这里处理任何异常,因为这是从不知道异常的旧代码库中调用的。

在我看来,我的选择是:

  1. 将客户端代码包装在一个巨大的 try 块中,并清理 catch 块中的向量。
  2. 在所有分配周围放置 try 块,其中的 catch 块调用公共清理函数。
  3. 一些我还没有想到的基于 RAII 的聪明想法。
  4. 平底船。实际上,如果构造函数抛出异常,应用程序无论如何都会陷入火海,但我想更优雅地处理这个问题。
0 投票
5 回答
789 浏览

c++ - 指向指针问题的指针

我有一个带有指向接口对象的(非智能)指针的类(我们称之为 pInterface),我正在构建一个嵌套类,它也需要访问该接口。我将通过将指向接口的指针传递给嵌套类的构造函数来解决这个问题,如下所示:

但是,我不确定将此指针存储在嵌套类中的最佳方式。我可以使用:

你们会建议什么,为什么?

编辑:我应该澄清 - 嵌套类将需要调用接口对象上的方法,但是它不会创建它(或修改“指向”的对象),父类对此负责。

0 投票
5 回答
8393 浏览

c++ - 引用计数指针的 STL 类?

这应该是微不足道的,但我似乎找不到它(除非不存在这样的类!)

智能指针的 STL 类(或类集)是什么?

更新

感谢您的回复,
我必须说我很惊讶没有标准实施。

我最终使用了这个: http: //archive.gamedev.net/reference/articles/article1060.asp