问题标签 [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 投票
2 回答
3613 浏览

c++ - 您应该如何使用 shared_ptr 返回 *this?

另见:类似问题

下面的代码显然很危险。问题是:您如何跟踪对 *this 的引用?

我有答案(发布在下面),我只是希望它出现在 stackoverflow 上(如果我错了,每个人都可以纠正我。)

0 投票
4 回答
1785 浏览

c++ - 从同一个指针构造两个 shared_ptr 对象

我有一个来自“C++ 标准库扩展”的问题:

练习 6
我在 2.4.2 节中说过,你不应该从同一个指针构造两个 shared_ptr 对象。危险在于 shared_ptr 对象或其后代最终都会尝试删除资源,这通常会导致麻烦。事实上,如果你小心的话,你可以做到这一点。它不是特别有用,但是编写一个程序,从同一个指针构造两个 shared_ptr 对象,并且只删除一次资源。

以下是我的回答:

但我认为这不是一个好的解决方案——因为我不想通过使用构造函数来解决它。谁能给我一个更好的?thx,请原谅我糟糕的英语。

0 投票
3 回答
2632 浏览

c++ - boost::shared_ptr use_count

我试图了解以下代码中发生了什么。当object-a被删除时,它的shared_ptr成员变量object-b是否保留在内存中,因为object-c持有一个shared_ptr到object-b?

0 投票
7 回答
7857 浏览

c++ - C++ 将 shared_ptr 提升为 hash_map 键

我正在制作一个神经网络,并希望使用 hash_map 来为每个神经元的输出神经元保留权重参考:

我意识到我不能使用 boost::shared_ptr 作为 stdext::hash_map 的键,那么还有什么建议呢?是否有任何变通方法或者是使用不同键或切换到 std::map 的唯一选择?谢谢!

这是错误:

0 投票
2 回答
539 浏览

c++ - 专用于 shared_ptr 的集合

是否存在一个知道 shared_ptr 内部结构并避免定期复制存储的 shared_ptr 元素而只复制其内部弱指针的集合?

这隐含地意味着,不会进行构造函数/析构函数调用,并且不会对 shared_ptrs 的引用计数器进行操作。

0 投票
8 回答
13684 浏览

c++ - 我怎么知道谁持有 shared_ptr<>?

我在 C++ 的应用程序中使用 boost::shared_ptr。内存问题真的很严重,应用程序占用大量内存。

但是,因为我将每个新对象都放入了一个 shared_ptr,所以当应用程序退出时,无法检测到内存泄漏。

必须有一些东西,比如std::vector<shared_ptr<> >持有资源的池。调试时如何知道谁拥有 shared_ptr?

很难逐行查看代码。代码太多...

非常感谢!

0 投票
1 回答
6760 浏览

c++ - 不同风格的 shared_ptr 之间的差异

boost::shared_ptr,std::tr1::shared_ptr和即将到来的 (in C++0x)之间有什么区别std::shared_ptr吗?

从一个移植到另一个会有任何开销还是它们基本相同?

0 投票
2 回答
4526 浏览

c++ - boost::shared_ptr 和多线程访问

我正在尝试实现一个多线程框架,其中输出对象在我的网络线程运行的每一帧的末尾创建,以便另一个线程可以在其帧的开头获得最新的“完成输出”指针并且知道它对存储在输出对象中的任何数据具有安全且完整的只读访问权限。

我的(非常早期的)方法主要涉及以下代码块:

网络处理器 -

ClientNetworkHandler -

PyCruHandler -

基本上,ClientNetworkHandler 和 PyCruHandler 在不同的线程上独立运行。PyCruHandler 从来没有真正用它的 m_latestNetworkOutput 副本做任何事情;我已经注释掉了以任何方式访问它的所有其他实例,但我仍然遇到以下问题:

如果我允许两个线程调用 swap(或 operator= 等效项),那么最终(通常在运行后 2 秒内,但有时需要几分钟)我将在 operator new 或分配器删除一些时收到以下错误种类:

“堆:释放堆块 2bab3b0 在释放后在 2bab3dc 处修改 Windows 已触发断点。

这可能是由于堆损坏,这表明存在错误……等等。”

我只是一个新手,但对我来说,这似乎表明 shared_ptr 对象之间的线程安全和时间敏感访问问题存在某种问题。但是,我一直对 shared_ptr 线程安全细微差别的解释(这里和其他地方)感到尴尬 - 一篇阅读表明引用计数是线程安全的,因此复制 shared_ptr 周围是安全的(但它们的内部对象不会是线程安全的),其他阅读表明在 shared_ptr 中实际上没有任何有用的线程安全性。我已经阅读了有关 shared_ptrs 线程安全的 boost 文档,但是我仍然没有弄清楚这是否应该是我的代码中的一个问题。

我的问题是,这里的任何人都可以发现我正在做的任何明显缺陷吗?我的目标是我可以访问仍由拥有线程存储的最新输出对象,然后该对象不会被删除(即使在拥有线程移至以后的输出之后),直到输出的每个用户都完成了它也是。在我看来,共享指针似乎是完美的……但是在我用头撞了 3 个小时之后,我开始怀疑……

非常感谢您,如果我以某种方式错误地发布了此内容,我深表歉意;这是我第一次来这里,就协议而言,FAQ 似乎很悠闲!

0 投票
3 回答
17950 浏览

c++ - 你什么时候会使用 std::auto_ptr 而不是 boost::shared_ptr?

我们几乎已经boost::shared_ptr在所有代码中都使用了,但是我们仍然有一些孤立的情况使用std::auto_ptr,包括单例类:

有人告诉我有一个很好的理由为什么没有这样做shared_ptr,但对于我的生活,我无法理解为什么?我知道这auto_ptr最终会在下一个标准中被标记为折旧,所以我想知道我可以用什么/如何替换这个实现

另外,还有什么其他原因可以让您考虑使用 anauto_ptr而不是 ashared_ptr吗?您是否看到将来迁移到 shared_ptr 有任何问题?


编辑:

  1. 因此,在回答“我可以在上面的代码中安全地替换auto_ptrshared_ptr”时,答案是肯定的 - 但是我会受到一点性能影响。
  2. auto_ptr最终被标记为折旧并且我们转移到时std::shared_ptr,我们需要彻底测试我们的代码以确保我们遵守不同的所有权语义。
0 投票
4 回答
7109 浏览

c++ - C++ 中的 shared_ptr 和引用

C++ 中的引用是一种方便的构造,它允许我们简化以下 C 代码:

共享指针是 C++ 中简化内存管理的另一个便利。但是,我不确定如何将 a 传递给通过引用接受参数shared_ptr的函数?f(object& o)

当它的对象通过引用传递给函数时,共享指针会增加吗?