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

c++ - 要获得引用计数,我是否必须将我的 API 与 shared_ptr 混为一谈?

我最近遇到了以下内存错误,在这里很容易发现,但在更复杂的代码中更难检测到:

错误是Bar立即超出范围,被销毁然后在foo->test(). 一种解决方案是Bar在堆上创建,使用Bar* bar = new Bar(). 但是,我不喜欢这样做,因为我必须将Bar* bar指针保持在顶层,这样我才能delete在最后访问它,即使Bar是特定于该特定代码块的东西if(whatever){}

另一个解决方案是boost::shared_ptr<Bar>,但我不能只写这个:

因为shared_ptr也立即超出范围,破坏了包含的对象。

所以简而言之,为了摆脱这个问题,我必须在shared_ptr任何地方使用,inFoo作为成员变量,inFoo的构造函数等。为了消除这些问题,我所有的 API 等都必须使用shared_ptr,这很友好丑陋的。但是,这样做是正确的吗?到目前为止,我有时使用它来创建引用计数对象,但我的 API 保持干净shared_ptr。你如何处理这个问题,一旦你使用,shared_ptr你必须在任何地方使用它?

(另外,如果你使用这些引用计数的指针,你必须开始担心你是否真的想要shared_ptr或者更确切地说weak_ptr等等)

而且,我将使用什么来等效于Foo(const Bar& bar)Foo(const shared_ptr<const Bar> bar)?

当然,另一种选择是在自己的Bar对象和其他对象中添加引用计数,使用pimpl自己的计数器,但作为一般规则,这太乏味了。

0 投票
3 回答
2409 浏览

c++ - 智能指针的迭代和容器

我有一个指向可变对象的智能指针容器。我必须编写两个for_each循环,一个用于将对象作为只读数据访问,另一个用于可变数据。编译器告诉我这std::vector< boost::shared_ptr<Object> >不一样std::vector< boost::shared_ptr<const Object> >,注意const.

这是我的示例代码:

鉴于上述所有细节,我如何实现Record_Basein的纯抽象方法Record_Derived

我试过了:

  • 返回m_fields.begin()
    返回转换错误(不能转换std::vector<...> to Field_Iterator
  • 返回&m_fields[0],这是危险的,因为它假设了std::vector.

顺便说一句,我没有使用std::for_each,因为我必须遍历一个字段容器一个子记录容器。

0 投票
4 回答
390 浏览

c++ - 如何将 boost::shared_ptr 引入现有的(大型)C++ 代码库?

我目前正在尝试通过引入智能指针的使用来修复我们代码库中的一些弱点。代码库非常庞大,并且像一只吃了一对多咖啡的蜘蛛一样相互关联。

我想知道人们是否尝试过以前的方法以及他们的方法是什么。

我的第一步是 typedef 类,如下所示。

现在我意识到这将导致大量的编译区域,比如

启用智能指针时将完全停止。

我想知道在这个早期阶段我是否可以做些什么来减少编译错误的数量,还是我怀疑只是根据具体情况进行处理。

干杯丰富

0 投票
3 回答
1171 浏览

c++ - 在构造函数中分配共享 ptrs (boost),单元测试

我有一个 C++ 类(在一个 dll 项目中),它的成员变量是 boost::shared_ptrs 到其他类的对象。是在类构造函数中分配它们更好,还是有一个单独的 init() 函数来做到这一点。

我假设 boost::shared_ptr 中指向 T 的指针的默认值为 NULL。因此,如果我在构造函数中什么都不做,boost::shared_ptr 的 get() 在调用 Init() 函数之前返回 NULL。

此外,当在一个赋值语句中出现内存分配问题时,我应该捕获异常(在 Init 中)还是告诉这个 Init() 的调用者捕获该异常是否好?boost::shared_ptr a(new T);

是否有标准方法来模拟单元测试中的内存分配异常?并查看所有对象都已正确释放

0 投票
3 回答
2466 浏览

c++ - 让 shared_ptr refs 出现在 doxygen 协作图中

我已经做了足够的谷歌搜索知道如果我有类似的东西

如果我有一个像这样的虚拟声明,我可以让 Doxygen 创建“正确”的协作图

在我的头文件中。

我的问题是:我如何让它适用于我的所有项目和所有标题,而不必在每个文件中实际包含该行?

0 投票
6 回答
9854 浏览

c++ - 如何获取指向 shared_ptr 的指针?

我现在正在破解旧的 C 代码,尝试使其更像 C++/Boost 风格:

有一个资源分配函数看起来像:

我尝试用 shared_ptr 包装 src:

我刚才忘了提。我需要这样做作为一个循环

我可以这样做吗?

0 投票
3 回答
1321 浏览

c++ - shared_ptr 需要完整的类型;不能与 lua_State* 一起使用

我正在为 Lua 编写一个 C++/OOP 包装器。我的代码是:

问题是 lua_State 是不完整的类型,而 shared_ptr 构造函数需要完整的类型。我需要安全的指针共享。(有趣的是 boost 文档说大多数函数不需要完整的类型,但构造函数需要,所以没有办法使用它。http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smart_ptr.htm )

我能解决这个问题吗?谢谢你。

0 投票
4 回答
379 浏览

c++ - 确保用户使用 shared_ptr 而不是常规 ptr 的正确方法是什么?

在我的类中,构造函数是私有的,我添加了一个静态方法“CreateMyClassPtr”,它使用构造函数并返回它的 share_ptr。

它是正确的实现吗?

你认为我什至必须确保它shared_ptr会被使用吗?我应该把它留给用户来决定吗?

0 投票
4 回答
354 浏览

c++ - 我不能使用 auto_ptr 的 std::vector - 我应该使用 shared_ptr 吗?

我真的不需要共享对象,但我确实想确保不会发生内存泄漏。在这种情况下使用 shared_ptr 是否正确?

0 投票
2 回答
1905 浏览

c++ - 如何在没有定义显式函数的情况下使用 boost::bind 在 boost::shared_ptr 中保持引用?

我想保留对对象的引用,这样它就不会在绑定函数中被删除,但不使用辅助函数。

有没有办法在适当的位置声明 holdReference 函数?就像 lambda 表达式或某事一样?(不使用这个讨厌的 holdReference 函数,必须在 fun 函数的范围之外声明)我尝试过很少但没有编译过:)

好的,这是更详细的示例: