问题标签 [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 回答
1023 浏览

c++ - 智能指针。何时、何地以及如何?

首先,由于有不同种类的智能指针,我想把这个问题集中在其中两个上:引用计数的侵入式和非侵入式智能指针。针对每种指针类型单独询问该问题。

我不太确定如何提出我的问题,所以这就是我不问的:我不问为什么或何时需要智能指针。我应该使用哪种类型的智能指针以及用于什么。

这就是我要问的,我希望它足够清楚:在处理“智能管理”对象时,我应该在哪些上下文中使用哪种指针语义?也就是说,智能指针语义、原始指针语义、其他东西(例如对智能指针的引用)?

很明显,当我“存储”指向对象(对象是引用计数的内存实体)的指针(例如全局指针或作为类成员)时,它应该是智能指针,因此它会声明所有权,但是其他情况呢?

当我将指针作为函数参数传递时,它应该是智能指针、原始指针、对智能指针的引用还是其他什么?返回的指针呢?本地指针?很快...

当然,我可以在任何地方使用智能指针,这是最安全的选择,但我觉得这确实没有必要,而且会增加开销。

0 投票
9 回答
7286 浏览

c++ - 如何在必须复制构造的类中使用 std::auto_ptr?

我有foo一个包含我想复制构造的 std::auto_ptr 成员的类,但这似乎是不允许的。作业也有类似的情况。请参见以下示例:

我可以声明_c为,mutable但我不确定这是正确的。有没有人有更好的解决方案?

编辑

好的,我没有得到我期望的那种答案,所以我会更具体地说明这个问题。

  • 类型的对象foo在堆栈上创建并按值传递给容器类(不是 stl),然后超出范围。我无法控制容器代码。(它实际上是一个活动队列实现,有错误。)
  • 该类bar是一个相当重量级的解析器。它的性能非常差newdelete因此即使它是可复制的,也太昂贵了。
  • 我们可以保证,当一个bar对象被创建时,它一次只需要在一个地方拥有。在这种情况下,它在线程之间传递并在事务完成时被删除。这就是为什么我希望使用std::autp_ptr.
  • 我非常愿意考虑提升智能指针,但如果有替代方案,我希望能保证这种唯一性。
0 投票
4 回答
1089 浏览

c++ - 是否有可以配置为在销毁时不删除的 boost 智能指针类?

我有一个智能指针列表。我希望其中一些智能指针充当常规指针,这意味着它们只是对实例的引用,不参与其释放。例如,它们可能指向堆栈上分配的实例。列表中的其他智能指针应充当常规 boost::shared_ptr。

这是该类的外观:

如果有一个 boost 类可以做到这一点,我宁愿使用它而不是自己编写一个类。似乎没有,还是我弄错了?

0 投票
1 回答
1876 浏览

c++ - How to implement smart pointer which can be instantiated with void?

Some smart pointer templates, such as boost::shared_ptr, may be instantiated with void to hold an arbitrary object:

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/sp_techniques.html#pvoid

Below is a minimal scoped_ptr implementation. When instantiated with void, the compiler complains about an illegal "reference to void" being formed in the dereference operator. It seems the "substitution failure is not an error" (SFINAE) rule does not cover this situation.

How then is it possible to implement a scoped_ptr? In particular, is there an alternative to writing a template specialization? This would cause large code reduplication with a realistic smart pointer implementation.

0 投票
6 回答
2303 浏览

c++ - 实现智能指针 - 使用模板动态分配

我正在编写一个智能指针 countedptr 并且遇到了减速带。countedptr 的基本功能是像任何其他智能指针一样工作,并且还计算有多少指针指向单个对象。到目前为止,代码是:

[解决了]

当我尝试做类似的事情时

然后我收到一个编译器错误,提示“在 '*(&one)->counted_ptr::operator->with T = double' 中请求成员 'pointer',它是非类类型 double”。

我考虑过创建一个函数来执行此操作,虽然我可以创建一个函数来分配一个 T 数组,但我想不出一种方法来创建一个用于分配实际对象的方法。任何帮助表示赞赏,谢谢。

0 投票
2 回答
1644 浏览

c++ - 实现智能指针 - 将模板类存储在向量中

我无法将智能指针的实例存储到容器中。这是指针的代码。

在 int main() 中,该vector<counted_ptr<double> >行编译。当我第一次尝试它时vector<counted_ptr<double> >它没有编译(可能是因为它缺少参数。)但是,当我尝试使用 push_back 时,例如

我得到一个编译器错误,它打开了 vector.tcc 并带有特定的错误说

我猜 push_back 找不到 counted_ptr,但我真的不确定。任何帮助表示赞赏,谢谢。

编辑:但是,这有效。测试[0] = 一;我猜 push_back 的语义是限制它的原因。

0 投票
3 回答
1530 浏览

c++ - “this”指针和智能指针是否应该混合使用?

我应该如何避免将“this”指针与智能指针一起使用?是否有任何设计模式/一般建议来解决这个问题?

我假设将两者结合起来是不行的,因为:

  1. 您将本机指针传递给智能指针管理的对象,这首先破坏了使用智能指针的意义,
  2. 如果您在使用时将“this”指针包装在智能指针中,例如“return CSmartPtr(this);”,则您已经有效地设置了多个智能指针来管理同一个对象,因此第一个引用计数为零的指针将从另一方下方摧毁该物体,或
  3. 如果您有一个保存 CSmartPtr(this) 值的成员变量在这些情况下返回,它最终将是一个循环引用,导致引用计数始终为 1。

为了提供一些背景信息,我最近了解了将 STL 容器与对象组合的负面影响(重复浅拷贝、使用基类容器时的切片等),因此我将代码中的一些用法替换为指向对象的智能指针。一些对象使用“this”指针传递对自身的引用,这就是我卡住的地方。

我发现智能指针+“this”被认为是有害的?问了一个有点类似的问题,但答案没有用,因为我没有使用 Boost。

编辑:我一直在做的一个(非常做作的)例子是

0 投票
5 回答
4358 浏览

c++ - 智能指针应该如何向下转换?

智能指针是否处理向下转换,如果不是,解决此限制的安全方法是什么?

我正在尝试做的一个示例是拥有两个包含智能指针的 STL 向量(例如)。第一个包含指向基类的智能指针,而第二个包含指向派生类的智能指针。智能指针被引用计数,例如与 Boost 的 shared_ptrs 类似的行为,但手动滚动。我已经包含了一些示例代码,我整理了这些示例代码以提供示例:

这对我来说似乎不安全,因为我认为我最终会使用两个智能指针来管理同一个对象。在跟踪的某个时刻,这可能会导致其中一个释放对象,而另一个仍然持有对它的引用。

我希望但不认为会起作用的是在保持相同对象的同时直接向下投射,例如

我是否应该将第二个容器更改为也使用 CBaseSmartPtr 并仅在使用时降低?还有其他解决方案吗?

0 投票
8 回答
8935 浏览

c++ - 应该一直使用 boost::ptr_vector 代替 std::vector 吗?

只是我一直遇到的一个概念性问题。在我目前的项目中,感觉就像我过度使用了 boostsmart_ptrptr_container库。我boost::ptr_vectors 在许多不同的对象中创建并调用 transfer() 方法将某些指针从一个移动boost::ptr_vector到另一个。

据我了解,清楚地显示堆分配对象的所有权很重要。

我的问题是,是否希望使用这些 boost 库来创建属于对象的堆分配成员,然后get()在进行任何处理时使用指向这些成员的普通指针。

例如... 一个游戏可能有一组属于它的 Tiles。在boost::ptr_vector. 游戏结束后,这些图块应自动释放。

但是,如果我想暂时将这些 Tiles 放入 Bag 对象中,我应该boost::ptr_vector在包中创建另一个并将游戏的 Tiles 转移到 Bag 中,transfer()还是应该创建一个std::vector<Tile*>Tiles* 引用游戏中的 Tiles 并传递它到袋子里?

谢谢。

**编辑我应该指出,在我的示例中,The Game 将有一个 Bag 对象作为成员。袋子只会装满游戏拥有的瓷砖。因此,如果没有游戏,袋子就不会存在。

0 投票
4 回答
7109 浏览

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

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

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

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