Недавно я начал работать над одним унаследованным проектом и попытался исправить segfaults (double delete). Многие из них происходят на boost::shared_ptr
деструкторе или operator=
(на объектах, которые содержат shared_ptr). В коде содержится массовое использование shared_ptr-s, включая копирование, сброс(), назначение и т. Д. Согласно boost docs, у нас неверное использование - его небезопасно уничтожать/копировать/перезапускать тот же shared_ptr во многих потоках.boost :: shared_ptr drop-in replacement
Блокировка каждый раз кажется невозможным, поэтому im ищет замену для boost :: shared_ptr. Поэтому возникает вопрос: если я заменил все boost::shared_ptr
на std::shared_ptr
или std::tr1::shared_ptr
, то разрешим эту проблему? Кажется, tr1 - более безопасная версия, но для меня это непонятно. Второй вопрос - версия C++ 0x лучше, чем tr1? (Обратите внимание, мы имеем GCC 4.4.6 и не может обновить его)
gcc docs Согласно наблюдениям, C++ 11 станд :: shared_ptr должен исправить это, но им не уверен gcc4.4 версии ...
UPD : Просто эксперимент цветовой и теперь я знаю, что все 3 реализаций этого сегментацию на этом коде (GCC 4.4) .. кажется, я должен сделать пользовательский класс или, возможно, другой обходным путем ...
#include <iostream>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<int> ptrtype;
ptrtype p(new int);
void test() {
for(long i=0; i<1000000; ++i) {
ptrtype p1 = p;
p = ptrtype();
p.reset(new int);
}
}
int main() {
boost::thread_group tg;
for(int i=0; i<100; ++i) tg.add_thread(new boost::thread(test));
tg.join_all();
std::cout << "Normal exit\n";
return 0;
}
boost :: shared_ptr довольно прочный. Я не думаю, что замена его другой реализацией собирается «решить» что угодно. Если вы видите двойные удаления, вы будете продолжать их видеть, пока не найдете и не исправите свои ошибки. – Bukes
«Блокировка каждый раз кажется невозможной» означает, что у вас есть проблемы с потоками. Изменение реализации интеллектуального указателя не собирается вас покупать. boost :: shared_ptr не является ошибкой. –
Вы ищете универсальный общий указатель? –