在我目前的项目中,我广泛使用了boost::shared_ptr 。 最近我的队友也开始使用weak_ptr 。 我不知道使用哪一个,什么时候使用。 除此之外,如果我想将weak_ptr转换为shared_ptr ,我该怎么做。 在weak_ptr上创build一个shared_ptr的锁会影响我的代码在其他线程?
将派生types的shared_ptr传递给带有基types的shared_ptr的函数,最好的方法是什么? 我通常通过引用传递shared_ptr以避免不必要的副本: int foo(const shared_ptr<bar>& ptr); 但如果我尝试做类似的事情,这是行不通的 int foo(const shared_ptr<Base>& ptr); … shared_ptr<Derived> bar = make_shared<Derived>(); foo(bar); 我可以使用 foo(dynamic_pointer_cast<Base, Derived>(bar)); 但这似乎是次优的有两个原因: dynamic_cast对于简单的派生到基础的演员似乎有点过分。 据我所知, dynamic_pointer_cast创build一个副本(尽pipe是临时的)传递给函数的指针。 有更好的解决scheme吗? 后人更新: 原来是一个缺less头文件的问题。 另外,我在这里试图做的是被认为是反模式。 通常, 不影响对象的生命周期(即对象在函数期间保持有效的函数)的函数应该使用一个普通的引用或指针,例如int foo(bar& b) 。 使用一个对象的函数(即给定对象的最终用户)应该通过值来获取unique_ptr ,例如int foo(unique_ptr<bar> b) 。 调用者应该std::move值移入该函数。 延长对象生命周期的函数应该通过值来获取shared_ptr ,例如int foo(shared_ptr<bar> b) 。 避免循环引用的通常build议适用。 详情请参阅Herb Sutter的“ 回归基础” 。
我有很多boost::shared_ptr<MyClass>对象,并在某些时候我故意要delete其中的一些来释放一些内存。 (我知道那时我将永远不需要指向MyClass对象了。)我该怎么做? 我猜你不能用我用get()得到的原始指针调用delete() get() 。 我在boost::shared_ptr看到了函数get_deleter(shared_ptr<T> const & p) ,但是我不确定如何使用它,并且它旁边的实验就是这样说的。 (我认为我有提升1.38。) 也许只是分配一个新的空的boost::shared_ptr的variables? 这应该扔掉旧的价值,并删除它。
我正在用C ++ 11试验shared_ptr和make_shared ,并编写了一个小玩具的例子来看看调用make_shared时实际发生了什么。 作为基础结构,我使用了llvm / clang 3.0以及XCode4中的llvm std c ++库。 class Object { public: Object(const string& str) { cout << "Constructor " << str << endl; } Object() { cout << "Default constructor" << endl; } ~Object() { cout << "Destructor" << endl; } Object(const Object& rhs) { cout << "Copy constructor…" << endl; […]
当比较指针的两个变种 – classic vs. shared_ptr时,我对程序运行速度的显着提高感到惊讶。 用于testing二维Delaunay增量插入algorithm已被使用。 编译器设置: VS 2010(发布)/ O2 / MD / GL,W7 Prof,CPU 3.GHZ DualCore 结果: shared_ptr(C ++ 0x00): N[points] t[sec] 100 000 6 200 000 11 300 000 16 900 000 36 指针: N[points] t[sec] 100 000 0,5 200 000 1 300 000 2 900 000 4 shared_ptr版本的运行时间大约是10倍。 这是由编译器设置引起的还是C ++ 0x00的shared_ptr实现太慢了? VS2010探查器:对于原始指针,大约60%的时间是通过启发式search包含插入点的三angular形花费的(这是可以的,这是一个众所周知的事实)。 […]
传递shared_ptr的最佳实践是什么? 目前我通过shared_ptr函数参数如下所示: void function1( shared_ptr<TYPE>& value );