是否有通过引用分配 shared_ptr 的用例?
is there a use case for assigning shared_ptr by reference?
一般来说,shared_ptr必须通过复制语义来分配,以确保增加使用次数,避免出现指针引用存在但其跟踪的内存已被释放的情况在不同的线程中。
但是,我记得我曾经遇到过一个场景(在多线程代码中),其中通过引用分配 shared_ptr 是可以接受的、可取的和安全的。我无法再访问代码,也无法回忆起当时的情景。有人能想到什么时候这样的使用是安全的吗?
为了避免琐碎的场景,我会规定它是一个多线程程序,并且指针在多个线程中使用。
与任何对象类似,您可以随时使用对 shared_ptr
的引用,只要您知道所引用的 shared_ptr
将在引用的生命周期内继续存在。这实际上与任何其他参考文献没有什么不同。 shared_ptr
指向的对象无关紧要;如果在引用对象的生命周期结束后使用引用,则您正在处理未定义的行为。因此,如果引用的 shared_ptr
仍然存在,那么它所管理的对象至少有一个 shared_ptr
仍在引用它,因此不会被删除。
通过引用传递 shared_ptr
允许您在函数中分配对象,而无需锁定和引用计数,当您从函数 return a shared_ptr
并分配它时发生到调用者拥有的 shared_ptr
。
一般来说,shared_ptr必须通过复制语义来分配,以确保增加使用次数,避免出现指针引用存在但其跟踪的内存已被释放的情况在不同的线程中。
但是,我记得我曾经遇到过一个场景(在多线程代码中),其中通过引用分配 shared_ptr 是可以接受的、可取的和安全的。我无法再访问代码,也无法回忆起当时的情景。有人能想到什么时候这样的使用是安全的吗?
为了避免琐碎的场景,我会规定它是一个多线程程序,并且指针在多个线程中使用。
与任何对象类似,您可以随时使用对 shared_ptr
的引用,只要您知道所引用的 shared_ptr
将在引用的生命周期内继续存在。这实际上与任何其他参考文献没有什么不同。 shared_ptr
指向的对象无关紧要;如果在引用对象的生命周期结束后使用引用,则您正在处理未定义的行为。因此,如果引用的 shared_ptr
仍然存在,那么它所管理的对象至少有一个 shared_ptr
仍在引用它,因此不会被删除。
通过引用传递 shared_ptr
允许您在函数中分配对象,而无需锁定和引用计数,当您从函数 return a shared_ptr
并分配它时发生到调用者拥有的 shared_ptr
。