由于非常习惯用const来加强代码的封装性,结果最近遇到了一些问题,顺带研究了一下
以前基本没用过boost的智能指针,后来进了新项目组,引擎里遇到了大量boost的shared_ptr,intrusive_ptr指针,还有weak_ptr。因为遇到过更好用的weak_ptr,所以boost::weak_ptr感觉是个封装不是很好的瘸腿指针(相比起来可能效率高,但是使用起来很麻烦,访问其中的指针变量必须要调用lock()对象,感觉移植性大大减少,而且写起代码来感觉好冗余。。原谅我活在一个徒手用指针自己管理内存的时代),当然这只是顺带一提。
当时的问题是当我希望存储在智能指针里的px是const类型要怎么办。。这里要讲下shared_ptr,intrusive_ptr的区别
shared_ptr修改的是自己的引用计数,如果当内在px指针是常量,不会影响px的常量操作。。
当时有个小疑惑,原理都懂,但是虽然我不用影响px的任何数据,但是当我是最后一个px的拥有者的时候,我总是要析构的吧。这不就改变px了么。不是违背了const的属性么。。。这个时候要怎么办。。我本来以为会编译不过。。但是写了测试函数居然是正常的。。
结果谷歌了一下,居然发现一件开发C++这么久以来都不知道的事情。。原贴在。C++的语法是支持析构常量指针的。。
{ const Foo f; // use it} // destructor called here//If destructors could not be called on const objects we could not use const objects at all.(如果析构不能被常量对象调用,那我们也不能使用常量对象了)
这种解释倒是很容易接受。。如果shared_ptr是因为如此可以支持常量对象指针的。。
intrusive_ptr是侵入式指针,就是字面上的意思,修改的是px本身的引用计数,当px是常量的时候,我估计是不能编译通过的。
使用intrusive_ptr必须提供intrusive_ptr_add_ref与intrusive_ptr_release函数用来改变引用计数,如果想使用instrusive_ptr且装入const指针,px自带的引用计数的成员变量必须标为mutable来进行识别,并在const函数中进行修改
(刚看到文章,提到intrusive_ptr的使用时机,顺便贴过来 )