dzh*_*lil 7 c++ boost smart-pointers shared-ptr
C++中的引用是一个convneint结构,允许我们简化以下C代码:
f(object *p){
//do something
}
int main(){
object* p = (object*) calloc(sizeof(object));
f(p);
}
Run Code Online (Sandbox Code Playgroud)
至
f(object& o){
//do something
}
int main(){
object o = object();
f(o);
}
Run Code Online (Sandbox Code Playgroud)
共享指针是C++中另一种简化内存管理的便利.但是,我不知道如何将shared_ptr一个函数传递给一个f(object& o)通过引用接受参数的函数?
f(object& o){
//do something
}
int main(){
shared_ptr<object> p (new object());
f(*p);
}
Run Code Online (Sandbox Code Playgroud)
当通过引用函数传递其对象时,共享指针是否会递增?
GMa*_*ckG 10
取一个shared_ptr值,引用计数将增加.当你typedef这样做时,这会更容易:
typedef boost:shared_ptr<object> object_ptr;
void foo(object_ptr obj)
{
obj->/* stuff*/;
obj.reset(); //only resets this local copy, that means:
// reduce reference count (back to 1), and
// set obj to point at null.
}
int main(void)
{
object_ptr obj(new object());
foo(obj);
}
Run Code Online (Sandbox Code Playgroud)
请记住,引用是别名.当您通过引用传递时,您没有传递指针,副本等...,您正在别名另一个对象.(实际上它们是作为指针实现的):
typedef boost:shared_ptr<object> object_ptr;
void foo(object_ptr& obj)
{
obj.reset(); // the references was never increased, since a copy has not
// been made, this *is* obj in main. so the reference
// goes to 0, and obj is deleted
}
int main(void)
{
object_ptr obj(new object);
foo(obj); // after this, obj has been reset!
}
Run Code Online (Sandbox Code Playgroud)
永远记住要const正确,以防止错误:
typedef boost:shared_ptr<object> object_ptr;
void foo(const object_ptr& obj)
{
obj.reset(); // cannot do!
}
int main(void)
{
object_ptr obj(new object);
foo(obj);
}
Run Code Online (Sandbox Code Playgroud)
我认为您应该尽可能将智能指针作为引用传递,以避免无关的增量和减量(以及副本和诸如此类的东西).
| 归档时间: |
|
| 查看次数: |
6977 次 |
| 最近记录: |