问题标签 [shared-ptr]

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 投票
3 回答
4354 浏览

c++ - 通过引用传递 scoped_ptr 是一种好习惯(从一个方法到另一个类中的方法)?

或者如果我需要这样做,那么我应该只使用 shared_ptr 吗?

0 投票
5 回答
20030 浏览

c++ - 通过 shared_ptr 的成本

我在整个应用程序中广泛使用 std::tr1::shared_ptr。这包括将对象作为函数参数传入。考虑以下:

虽然通过 shared_ptr 传递数据集对象可以保证其存在于 f 和 g 中,但函数可能会被调用数百万次,这会导致创建和销毁大量 shared_ptr 对象。这是最近运行的平面 gprof 配置文件的片段:

因此,大约 17% 的运行时间花在了 shared_ptr 对象的引用计数上。这是正常的吗?

我的应用程序的很大一部分是单线程的,我正在考虑将一些函数重写为

并更换电话

在我确定当程序流在 f() 内部时对象不会被破坏的地方。但在我跑去更改一堆函数签名/调用之前,我想知道通过 shared_ptr 传递的典型性能损失是什么。似乎 shared_ptr 不应该用于经常调用的函数。

任何输入将不胜感激。谢谢阅读。

-Artem

更新:将一些函数更改为 acceptconst Dataset&后,新配置文件如下所示:

我对析构函数调用的数量小于复制构造函数调用的数量感到有点困惑,但总的来说,我对相关运行时间的减少感到非常满意。感谢大家的建议。

0 投票
2 回答
982 浏览

c++ - 如何创建一个 shared_ptr 以传递给一个采用 void * 的函数

差不多就是这样。我需要分配内存并将其传递给一个接受 void * 的函数。我想使用 shared_ptr 但我不知道该怎么做。

0 投票
6 回答
5508 浏览

c++ - 如何在构造函数中处理“this”指针?

我有在其构造函数中创建其他子对象的对象,传递“this”以便子对象可以将指针保存回其父对象。我在编程中广泛使用 boost::shared_ptr 作为 std::auto_ptr 或原始指针的更安全替代方案。所以孩子会有诸如 , 之类的代码shared_ptr<Parent>,而 boost 提供了shared_from_this()父母可以给孩子的方法。

我的问题是它shared_from_this()不能在构造函数中使用,这并不是真正的犯罪,因为除非您知道自己在做什么并且不介意限制,否则无论如何都不应该在构造函数中使用“this”。

Google 的 C++ Style Guide声明构造函数只应将成员变量设置为其初始值。任何复杂的初始化都应该在显式的 Init() 方法中进行。这解决了“this-in-constructor”问题以及其他一些问题。

困扰我的是,现在使用您的代码的人必须记住每次构造您的对象时都调用 Init()。我能想到的唯一方法是通过断言 Init() 已经在每个成员函数的顶部被调用,但这写起来很乏味,执行起来也很麻烦。

在此过程中的任何步骤中是否有任何成语可以解决此问题?

0 投票
3 回答
1495 浏览

c++ - 为什么 boost::shared_ptr 中的引用计数器不可变?

boost::shared_ptr析构函数中,这是完成的:

wherepn是指向引用计数器的指针,其类型定义为

考虑到线程使用和上面析构函数中的非原子 0-check-and-deletion,我本来希望是long。为什么不挥发?volatile longshared_ptr

编辑:

事实证明,我查看了未指定多线程使用时使用的标头(atomic_count.hpp)。在 atomic_count_win32.hpp 中,为多线程使用正确实现了减量。

0 投票
4 回答
936 浏览

c++ - 有没有办法通过将引用计数存储在受控对象中来提高 shared_ptr 的效率?

这正在成为我的代码中的一种常见模式,因为当我需要管理一个需要不可复制的对象时,因为 A. 它是“重”或 B. 它是操作系统资源,例如关键部分:

这样,shared_ptr 解决了引用计数问题,允许Resource复制,即使底层句柄只有在所有对它的引用都被销毁后才应该关闭。

Implementation但是,如果我们可以像 boost 的侵入式容器那样将数据移动到内部,似乎我们可以节省分配 shared_ptr 引用计数等的开销。

如果这让过早的优化问题困扰了一些人,我实际上同意我当前的项目不需要这个。但我很好奇这是否可能。

0 投票
3 回答
4941 浏览

c++ - 为什么 enable_shared_from_this 有一个非虚拟析构函数?

我有一个宠物项目,我用它来试验 C++11 的新特性。虽然我有 C 方面的经验,但我对 C++ 还是很陌生。为了训练自己掌握最佳实践(除了大量阅读),我启用了一些严格的编译器参数(使用 GCC 4.4.1):

这对我来说效果很好。到现在为止,我已经能够解决所有的障碍。但是,我需要enable_shared_from_this,这给我带来了问题。编译我的代码(可能由 触发)时,我收到以下警告(在我的情况下是错误-Weffc++):

所以基本上,我对这个实现有点困扰enable_shared_from_this,因为:

  • 用于子类化的类的析构函数应该始终是虚拟的,恕我直言。
  • 析构函数是空的,为什么还要它呢?
  • 我无法想象有人会想通过引用来删除他们的实例enable_shared_from_this

但我正在寻找解决这个问题的方法,所以我的问题是,有没有合适的方法来处理这个问题?并且:我认为这个析构函数是虚假的,还是有真正的目的,我是否正确?

0 投票
4 回答
145 浏览

c++ - 为什么这些 shared_ptrs 不指向同一个容器?

我有一个班级模型:

Deck继承自CardStack

我试图通过以下方式_stack[0]指出同一件事_deck

似乎分配 to_deck_stack[0]导致_deck制作副本。(我知道这一点是因为修改_stack[0]不会导致对 . 的修改_deck。)我怎样才能让它们指向同一个东西?

好的 - 没有调用复制构造函数。我已经通过实现它并查看它是否被调用来验证这一点 - 它没有。

CardStack但是 - 我有一个对对象进行操作的函数:

现在 - 当我打电话时:

我得到这个输出(其中 a 上的 std::coutCardStack将打印出该堆栈的大小):

...所以我得出的结论(错误地?)_stack[DECK]指向不同的东西。

甲板

0 投票
3 回答
1191 浏览

c++ - Intellisense 在 Visual Studio 2008 中使用 Boost 1.40.0 的 boost::shared_ptr 失败

我无法让智能感知自动完成 boost 1.40.0 的共享指针。(它适用于 Boost 1.33.1。)这是一个简单的示例项目文件,其中自动完成不起作用:

当我右键单击 shared_ptr 并执行“转到定义”时,它会将我带到<boost/exception/exception.hpp>. 它并没有让我想到实际的定义,即<boost/smart_ptr/shared_ptr.hpp>. 但是,它编译得很好,并且自动完成对“boost::”工作得很好。此外,自动完成对于 boost::scoped_ptr 和 boost::shared_array 也很有效。

有任何想法吗?

0 投票
3 回答
6381 浏览

c++ - 我可以将 boost::make_shared 与私有构造函数一起使用吗?

考虑以下:

看起来 DirectoryIterator 应该可以调用boost::make_shared<DirectoryIteratorImpl>,因为它是DirectoryIteratorImpl. 但是,此代码无法编译,因为 DirectoryIteratorImpl 的构造函数是私有的。

因为这个类是一个内部实现细节,客户端DirectoryIterator永远不应该接触,如果我可以保持构造函数私有,那就太好了。

这是我的基本误解make_shared还是我需要标记某种增强片段friend以便编译调用?