Увеличить проблему shared_ptr с библиотеками TR1
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;
}
Тогда где-то в моей программе я пишу:
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 и типа "где", я вижу это:
0) 0xb7fd8430 в __kernel_vsyscall ()
1) 0xb7d9bece в _lll_mutex_lock-wait() из /lib/i686/libpthread.so.0
2) 0xb7d98500 в _L_mutex_lock_71 () из /lib/i686/libpthread.so.0
3) 0xbfbefab8 в?? ()
4) 0x00000000 в?? ()
Или это:
0) 0xb7fd8430 в __kernel_vsyscall ()
1) 0xb7d9bece в _lll_mutex_lock-wait() из /lib/i686/libpthread.so.0
2) 0xb7d98500 в _L_mutex_lock_71 () из /lib/i686/libpthread.so.0
.. не знаю, что здесь, я вижу только " .. в?? ()"
10).. в __gthread_mutex_lock
11).. в __gthread_mutex_lock
12).. в std::tr1::_Sp_counting_base:: release
13).. в ~ shared_count
14).. в ~shared_ptr
Кажется это как shared_ptr
сломано?
1 ответ
Я только что решил эту проблему. Изменено это:
#include <tr1/memory>
в #include <boost/shared_ptr.hpp>
std::tr1::shared_ptr
в boost::shared_ptr
Решение описано здесь ссылка