zoukankan      html  css  js  c++  java
  • boost智能指针指定const对象问题

    由于非常习惯用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的使用时机,顺便贴过来 boost::intrusive_ptr用法)

  • 相关阅读:
    Oracle调优总结--(经典实践 重要)
    ORACLE索引介绍和使用
    ORACLE索引介绍和使用
    oracle update 改为 merge
    oracle update 改为 merge
    在 Eclipse 下利用 gradle 构建系统
    在 Eclipse 下利用 gradle 构建系统
    关于SQL查询效率,100w数据,查询只要1秒
    关于SQL查询效率,100w数据,查询只要1秒
    Add Binary
  • 原文地址:https://www.cnblogs.com/kongxian/p/4292608.html
Copyright © 2011-2022 走看看