我做了很多的使用的增强::scoped_ptr在我的代码这是伟大的,但我目前正在与软件的使用情况,所有的地方我想知道如果我失去了一些东西。

据我所知的一个情况只是有用的,如果不同线将要访问的同样数据和你不知道是什么了的线一定要完成(与的情况,确保对象存在,直到最后一个线程已经完成了它)。

还有没有其他的使用情况?

有帮助吗?

解决方案

线程是这里无关紧要。什么是相关的是,是否可以很容易地指定一个点,在该对象不再使用。

假设几个不同的对象要使用相同的对象。这可能是数据包,或用于输入/输出,或者一些几何对象,或任何。你想共享对象被删除之前在所有的使用对象被删除,而不是一个时钟周期。而不是找出哪些所属对象都将有最长的寿命(和如果通过用户交互改变程序,或者,可以改变),则可以使用一个shared_ptr迫使此行为。

不要紧的使用对象是否是在相同或不同的线程。对象可以有不可预知的寿命,即使他们都在同一个线程。

其他提示

  

AFAIK一个shared_ptr是如果只有有用   不同的线程将要   访问相同的数据

好了,它是在多个的所有者拥有相同的对象由智能指针所指向的情况。他们可以从不同的线程访问智能指针,和的shared_ptr 是在这方面太有用,但这不是重点。如果最后的所有者失去其参考指向对象时,shared_ptr的机制删除对象。

您可以使用使用scoped_ptr 如果你想拥有时的范围是中左派的创建被删除的指针(无论是例外,通过的转到的到外侧的地方,或通过正常的控制流或一些其它机制)。如果你使用它这样,也没有必要改变,以shared_ptr的。

之间的差scoped_ptr和情况(和auto_ptr)主要是复制的语义。

  • scoped_ptr是"资源分配是初始化"并不是可以复制(它不能与其他实例以及所有权不可转让)
  • 情况是自动回收的存储时间共享多方
  • auto_ptr是可以复制(和所有权转移时分配)

的shared_ptr和scoped_ptr的之间的另一个重要区别是,只有用的shared_ptr工作的weak_ptr。弱指针被用来打破共享指针的周期,从而避免内存泄漏,但weak_ptr的可用于不止于此。

共享和弱指针可以用来表达拥有和非所属基准之间的差值。数据的明确的所有权导致清洁器设计,因此,当可能的数据对象应由的一个其他通过一个shared_ptr对象所拥有。数据对象的所有其他长期引用应该是弱指针,表达了其数据的非所有权。每当任何非拥有模块访问数据,他们需要的的weak_ptr转换为一个shared_ptr,在这一点上,他们可能会发现,数据对象不再存在。但是,虽然非拥有模块访问数据对象,他们将其保持通过短暂的shared_ptr,确保即使所属对象分别以释放数据安全运行。

如已经回答,shared_ptr的是约共享所有权。然而,我认为共享所有权一般坏事(例外存在,如轻量级图案),它是更好地识别的所有者和放scoped_ptr的存在。

一个shared_ptr的是,确实引用计数智能指针类型。如果只有一个对象(常见的情况)的所有者,那么scoped_ptr的是正确的解决方案。如果该对象可以将代码的多个部分之间共享,那么shared_ptr的不会让对象遭到破坏,直到给它的所有引用都被释放。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top