【发布时间】:2019-12-27 15:13:04
【问题描述】:
如果我取消引用 shared_ptr 并在包含的对象上调用方法,shared_ptr 的生命周期是否得到保证?
假设:
stream.linkInfoPtr->addTxRxBytes( txBytes, rxBytes );
其中linkInfoPtr 是shared_ptr 并存储在流对象中。这是否意味着如果linkInfoPtr 在addTxRxBytes 调用期间被另一个线程销毁,我将面临段错误?
【问题讨论】:
-
只要您有一个指向对象的共享指针(共享对象的所有权),该对象就会保持活动状态。如果您将共享指针按值(从而共享所有权)传递给线程,则指向的对象不会结束其生命周期
-
是的,但是在这个范围内,我没有 shared_ptr 的副本,这意味着我可能会在这里创建一个段错误的可能性,对吧?
-
但是
linkInfoPtr不是共享指针对象的副本吗?只要你有这个副本,并且linkInfoPtr没有结束它自己的生命周期,它共享所有权的对象就会保持活动状态。 -
请贴出真实的代码而不是模糊的解释。
-
如果您有数据竞争,那么获取副本将无济于事。如果另一个线程破坏了
linkInfoPtr,就在你准备复制它的时候,就在auto linkPtr = stream.linkInfoPtr执行的时候?您应该专注于消除程序中的数据竞争,而不是试图避免其后果——后者是不可能的。
标签: c++ c++11 shared-ptr