2013-10-29 52 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