簡體   English   中英

提升:: weak_ptr <T> .lock()因SIGSEGV分段錯誤而崩潰

[英]boost::weak_ptr<T>.lock() Crashes with a SIGSEGV Segmentation Fault

(編輯)環境:

plee@sos-build:/usr/local/include/boost$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 11.10
Release:        11.10
Codename:       oneiric

plee@sos-build:/usr/local/include/boost$ uname -a
Linux sos-build 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
plee@sos-build:/usr/local/include/boost$

plee@sos-build:/usr/local/include/boost$ cat version.hpp
//  BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION
#define BOOST_LIB_VERSION "1_47"

我一直在從事服務器端項目。 我使用boost庫,例如boost::asioboost::shared_ptrboost::weak_ptr

Boost文檔( http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/weak_ptr.htm#lock )指出, weak_ptr<T>.lock不會拋出:

shared_ptr lock()const; 返回值:expired()? shared_ptr():shared_ptr(*此)。

拋出:什么都沒有。

但是,在我的應用程序中,它甚至崩潰了:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffeffff700 (LWP 5102)]
0x000000000066fe08 in boost::detail::atomic_conditional_increment (pw=0x800000000007)
    at /usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:92
92      );
(gdb) 
(gdb) bt
#0  0x000000000066fe08 in boost::detail::atomic_conditional_increment (pw=0x800000000007)
    at /usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:92
#1  0x000000000066fe5c in boost::detail::sp_counted_base::add_ref_lock (this=0x7fffffffffff)
    at /usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:138
#2  0x000000000068009b in boost::detail::shared_count::shared_count (this=0x7fffefffe658, r=...)
    at /usr/local/include/boost/smart_ptr/detail/shared_count.hpp:518
#3  0x0000000000691599 in boost::shared_ptr<RtmpConnection>::shared_ptr<RtmpConnection> (
    this=0x7fffefffe650, r=...) at /usr/local/include/boost/smart_ptr/shared_ptr.hpp:216
#4  0x000000000068db48 in boost::weak_ptr<RtmpConnection>::lock (this=0x7fffe0e87e68)
    at /usr/local/include/boost/smart_ptr/weak_ptr.hpp:157

我檢查了/usr/local/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp崩潰的行

 69 inline int atomic_conditional_increment( int * pw )
 70 {
 71     // int rv = *pw;
 72     // if( rv != 0 ) ++*pw;
 73     // return rv;
 74
 75     int rv, tmp;
 76
 77     __asm__
 78     (
 79         "movl %0, %%eax\n\t"
 80         "0:\n\t"
 81         "test %%eax, %%eax\n\t"
 82         "je 1f\n\t"
 83         "movl %%eax, %2\n\t"
 84         "incl %2\n\t"
 85         "lock\n\t"
 86         "cmpxchgl %2, %0\n\t"
 87         "jne 0b\n\t"
 88         "1:":
 89         "=m"( *pw ), "=&a"( rv ), "=&r"( tmp ): // outputs (%0, %1, %2)
 90         "m"( *pw ): // input (%3)
 91         "cc" // clobbers
 92     );
 93
 94     return rv;
 95 }

第92行是匯編代碼。 我真的不知道那是什么意思。

我總是檢查返回的boost::weakptr<RtmpConnection>.lock()boost::shared_ptr<RtmpConnection>類型在我使用之前為空。

所以我用谷歌搜索,我看到了這個http://wiki.inkscape.org/wiki/index.php/Boost_shared_pointers

出於線程安全原因,不能取消引用弱指針。 如果在檢查弱指針到期后但使用它之前,其他某個線程破壞了該對象,則將導致崩潰

  1. 那么我該怎么辦,為什么會崩潰(看來boost::weakptr<RtmpConnection>.lock()永遠都不會崩潰)?
  2. 由於我的程序是多線程的。 在獲取並檢查boost::weakptr<RtmpConnection>.lock()的返回值之后, RtmpConnection可能被其他線程破壞了,Boost庫是否保證它不會被破壞,因為返回類型是boost::shared_ptr<RtmpConnection>嗎?

您很可能違反了正確使用智能指針的規則之一。 以下是最常見的智能指針規則沖突:

  1. 必須僅通過單個智能指針鏈來引用對象。 理想情況下,使用make_shared與對象創建智能指針,並且永遠不要使用原始指針。 但是否則,只能從常規指針創建一次智能指針。

  2. 僅從對象的強指針創建弱指針。 (或者,如果對象支持,則可以使用shared_from_this 。)

  3. 當智能指針引用對象時,不得通過調用delete銷毀對象。 理想情況下,您永遠不要對曾經有任何智能指針引用過的對象調用delete

造成這種問題的其他兩個典型原因。 一種是您有一個導致內存損壞的錯誤,例如數組邊界覆蓋,兩次釋放,一次釋放后訪問等等。 您可以使用valgrind類的工具檢查內存損壞錯誤。

最后,您可能錯誤地編譯了代碼或錯誤地編譯了Boost。 例如,您的平台可能具有需要啟用的編譯器選項才能編譯線程安全代碼。 (您沒有提及您的平台,因此我無法提供具體信息。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM