2013-10-29 63 views
1
class MyClass{ 
public: 
    MyClass() {} 
    virtual ~MyClass() {} 
}; 

extern "C" int foo(int tryNumber) 
{ 
    std::tr1::shared_ptr<MyClass> myClass(new MyClass()); 
    std::cout << "Object has been created " << tryNumber << << std::endl; 
    return 0; 
} 

然後在某處我的節目,我寫:升壓shared_ptr的問題

for (int i = 0; i < 10000; ++i){ 
    foo(i); 
} 

有事實:

1)GCC 4.0.1,我做不到更新他們呢。所以當我執行std::tr1::shared_ptr時,我看到編譯器使用boost/shared_ptr.hpp(boost 1.33.1)

2)那麼,程序使用了很多線程,我甚至不知道他們是如何工作的以及他們做了什麼完全(在我的工作的大項目),但我知道,我不使用任何共享變量或別的東西,可能會導致這種行爲

3)有時它只是打印:

對象被創建0

對象已創建1

...

對象已創建9999

而且一切正常

有時打印出0-1-2-3-4(或更多)線,然後停止。此外 - 我知道,該對象已創建,但函數沒有返回值和程序只是凍結,當我嘗試用gdb附加到程序並輸入「where」時 - 我看到:

0)0xb7fd8430在__kernel_vsyscall()

1)從/lib/i686/libpthread.so.0

2)0xb7d98500在_L_mutex_lock_71(在_lll_mutex_lock - 等待()0xb7d9bece)從/ LIB/i686的/的libpthread。 so.0

3)0xbfbefab8在? ()

4)0x00000000在?? ()

或者這樣:

0)__kernel_vsyscall()0xb7fd8430

1)從/lib/i686/libpthread.so.0在_lll_mutex_lock - 等待()0xb7d9bece

2)從/lib/i686/libpthread.so.0

0xb7d98500在_L_mutex_lock_71()..dunno是什麼在這裏,我看到的只有 「..在??()」

10)。在__gthread_mutex_lock

11)..在__gthread_mutex_lock

12)..在標準:: TR1 :: _ Sp_counted_base ::釋放

13)..在〜SHARED_COUNT

14)..in〜shared_ptr

看起來像shared_ptr壞了?

+0

我猜想,你做別的東西,你下來告訴我們,那攪亂堆棧,可能會發生某種未定義的行爲。您向我們展示的代碼不足以幫助您解決問題。 –

+0

@Joachim Pileborg相信我,我沒有做別的。這是一個大型項目,我正在編輯一個本地代碼。我幾天前遇到了這個問題[鏈接](http://stackoverflow.com/questions/19585236/the-exception-isnt-captured-by-catch-block),所以我試圖找出問題,並且這個主題描述我發現了什麼(在shared_ptr添加後發生問題) –

+1

使用某種內存調試器,如[Valgrind](http://valgrind.org/)。在這種情況下它可能會幫助你。 –

回答

1

我剛解決了這個問題。改變這一點:

#include <tr1/memory>#include <boost/shared_ptr.hpp>

std::tr1::shared_ptrboost::shared_ptr

這裏描述的解決方案link

+1

這是一個非常有用的參考鏈接。我正在優化標籤,以便將來的用戶儘快找到它。您也可以從鏈接的主題添加更多背景到您的答案,以防止鏈接腐爛 – sehe