c++ smart pointer 趣谈

 

上班的时候同事问起我一段项目中的旧代码,大致如下

void foobar()
{
    // some code here
    char* buffer = new char[length];
    std::auto_ptr<char> useless(buffer);
    // more code using 'buffer' here   
}

这段代码这样写的目的是:

  • buffer在超出scope(这里是函数foobar)时会自动释放,防止内存泄露,因为在后面的代码中有可能会提早返回或者抛出异常。
  • 后面在使用buffer的时候可以当成普通指针一样使用,避免了调用auto_ptr.get函数,只要不手动delete它

然后又给他讲了一些C++其他智能指针的用法,在给他解释的过程中,发现可以用一种有趣的方式来解释,即比喻。

 

我们将智能指针比作一个个性格迥异的人,智能指针里面的原始指针比作藏宝图,而原始指针指向的资源(内存,句柄,COM对象等等)比作宝藏。

 

scoped_ptr(from boost)

scoped_ptr是一个极度自私的人,自个独享藏宝图,不懂得怎么去分享或者传给后人,自己死了之后就会把宝藏毁掉,不想落入他人之手。

 

unique_ptr

unique_ptr稍微好点,他在自己死之前会把藏宝图传给自己的继承人,然后就这样代代相传。

 

auto_ptr

auto_ptr虽然看起来像是复印一份藏宝图给继承人,但是私底下干的却是传递的勾当,即不复印,只传递,传递之后自己就没有藏宝图了。

 

shared_ptr

唯一懂得共享宝藏的人就数shared_ptr了,多个shared_ptr共享宝藏,没有任何一个拥有绝对的所有权。而每一个shared_ptr都知道除了自己之外还有多少个shared_ptr共享这份宝藏。所以当一个shared_ptr死了之后,其他人都知道。那如果死的是共享宝藏的最后一个人,他才会把宝藏毁掉。

 

而在C++的世界中,需要各种性格的人,各有各的用处,哪怕是自私的人。所以像scoped_ptr这样的人也还算受欢迎,大家有时候就喜欢他的这份自私的品质。

但是表里不一的人在C++是不受欢迎的。曾经还没有unique_ptr的时候,大家还觉得auto_ptr很有用。自从unique_ptr诞生后,由于auto_ptr和unique_ptr都差不多,但是由于他说一套做一套,于是大家都建议不要去招惹他。

当然,我们不要忘了给好好先生shared_ptr发张好人卡。

 

暂时写到这里吧,估计知道各种智能指针的人都不知道我在讲些什么。

posted @ 2014-01-15 00:01  剑起飞虹  阅读(422)  评论(0编辑  收藏  举报