上班的时候同事问起我一段项目中的旧代码,大致如下
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发张好人卡。
暂时写到这里吧,估计知道各种智能指针的人都不知道我在讲些什么。