最近、私は 1 つのレガシー プロジェクトに取り組み始め、セグメンテーション違反 (二重削除) を修正しようとしました。それらの多くは、boost::shared_ptr
デストラクタまたはoperator=
(shared_ptr を含むオブジェクト) で発生しています。コードには、コピー、reset()-ing、割り当てなどを含む、shared_ptr-s の大規模な使用が含まれています。boost ドキュメントによると、有効な使用法がありません。多くのスレッドで同じ shared_ptr を破棄/コピー/リセットすることは安全ではありません。
毎回ロックするのは不可能に思えるので、boost::shared_ptr のドロップイン代替品を探しています。boost::shared_ptr
問題は、すべてを置き換えるstd::shared_ptr
かstd::tr1::shared_ptr
、この問題を解決するかということです。tr1 はより安全なバージョンのようですが、私にはわかりません。2 番目の質問 - c++0x バージョンは tr1 より優れていますか? (gcc 4.4.6 があり、アップグレードできないことに注意してください)
gcc docsによると、c++11 std::shared_ptr はそれを修正する必要がありますが、gcc4.4 バージョンについてはわかりません...
UPD:実験を行ったところ、3つの実装すべてがこのコード(gcc 4.4)でsegfaultを行うことがわかりました..カスタムクラスを作成するか、他の回避策を作成する必要があるようです...
#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;
}