|
1
7
线程在这里无关紧要。重要的是,是否很容易指定一个对象不再使用的点。 假设几个不同的对象想要使用同一个对象。它可能是一组数据,或用于输入/输出,或一些几何对象,或其他任何东西。您希望在删除所有正在使用的对象后删除共享对象,而不是之前的一个时钟周期。与其弄清楚哪个拥有对象的寿命最长(如果你改变程序,或者通过用户交互,这可能会改变),你可以使用shared_ptr来强制这种行为。 使用对象是在相同的线程中还是在不同的线程中并不重要。即使对象都在同一线程中,它们也可能具有不可预测的生命周期。 |
|
|
2
7
嗯,它适用于多种情况 主人 拥有智能指针指向的相同对象。他们可以从不同的线程访问智能指针,以及 shared_ptr 在那个领域也是可用的,但这不是重点。如果最后一个所有者失去了对所指向对象的引用,shared_ptr机制将删除该对象。 您可以使用 scoped_ptr 如果你只想有一个指针,当创建它的作用域被保留时(无论是由于异常还是由于 转到 或者通过正常的控制流或一些其他机制)。如果你这样使用它,就没有必要更改为shared_ptr。 |
|
|
3
2
scoped_ptr和shared_ptr(以及auto_ptr)之间的区别主要是复制语义。
|
|
|
4
2
shared_ptr和scoped_ptr之间的另一个重要区别是,只有shared_ptr可以与weak_ptr一起工作。弱指针用于打破共享指针的循环,从而避免内存泄漏,但Weak_ptr的用途不止于此。 共享指针和弱指针可用于表示拥有引用和非拥有引用之间的区别。明确的数据所有权会导致更清晰的设计,因此在可能的情况下,数据对象应由 一个人 通过shared_ptr访问其他对象。所有其他对数据对象的长期引用都应该是弱指针,表示它们对数据的非所有权。每当任何非拥有模块访问数据时,它们都需要将weak_ptr转换为shared_ptr,此时它们可能会发现数据对象不再存在。然而,当非拥有者模块访问数据对象时,它们通过瞬态shared_ptr持有它,即使拥有者对象释放数据,也能确保安全操作。 |
|
5
1
正如已经回答的那样,shared_ptr是关于共享所有权的。然而,我认为共享所有权通常是一件坏事(也有例外,比如轻量级模式),最好确定一个所有者并在那里放一个scoped_ptr。 |
|
|
6
1
shared_ptr是一种执行引用计数的智能指针类型。如果对象只有一个所有者(常见情况),那么scoped_ptr是正确的解决方案。如果对象可以在代码的多个部分之间共享,那么shared_ptr不会让对象被销毁,直到所有对它的引用都被释放。 |
|
|
Post Self · std::是否可以退出泄漏内存? 8 年前 |
|
|
OneRaynyDay · 在这种情况下,我应该使用智能指针吗? 8 年前 |
|
|
jcai · 对象的ctor和dtor必须在同一个线程上吗? 9 年前 |
|
|
Stradigos · 防止解构宏中定义的匿名变量,直到作用域结束 9 年前 |
|
|
user877329 · 通用句柄类 10 年前 |