最近我开始在一个传统项目上工作,并试图修复段错误(双删除)。它们中的很多正在发生在boost::shared_ptr
析构函数或operator=
(在包含shared_ptr的对象上)。代码包含shared_ptr-s的大量使用,包括复制,重置(),分配等。根据boost docs,我们没有有效的用法 - 它在多个线程中不能安全地销毁/复制/重置相同的shared_ptr。boost :: shared_ptr drop-in replacement
每次锁定似乎都不可能,所以即时搜索boost :: shared_ptr的插入替换。所以问题是:如果我用std::shared_ptr
或std::tr1::shared_ptr
替换所有boost::shared_ptr
将解决此问题?看起来tr1是更安全的版本,但对我来说并不明确。第二个问题 - C++ 0x版本比tr1更好吗? (注意,我们有GCC 4.4.6,并且不能升级)
Accoring到gcc docs,C++ 11的std :: shared_ptr的应该解决这个问题了,但是我不知道GCC4.4版本...
UPD :只要maked实验,现在我知道所有的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 2013-02-27 19:28:03
“每次锁定似乎都不可能”表示您有线程问题。改变智能指针的实现并不会为你购买任何东西。 boost :: shared_ptr不是越野车。 – 2013-02-27 19:28:59
你在寻找一个线程安全的共享指针吗? – 2013-02-27 19:31:35