BOOST库日常挑刺 之 scope_ptr 传递所有权

根据官方的介绍,scope_ptr 是没法传递所有权的,但是却可以获取他的原始指针,这似乎有些矛盾啊!直接看程序吧!

class Student
{
public:
    Student(std::string name):m_name(name)
    {
        std::cout << "Student()..." << std::endl;
    }

    ~Student()
    {
        std::cout << "~Student()..." << std::endl;
    }

    void set_name(std::string name)
    {
        m_name = name;
    }

    std::string get_name()
    {
        return m_name;
    }

private:
    std::string m_name;
};

void func_scope()
{
    boost::scoped_ptr<Student> sp_ptr1(new Student("Jerry"));
    boost::scoped_ptr<Student> sp_ptr2(new Student("Jack"));
    std::cout << "sp1:" << sp_ptr1->get_name() << ", sp2:" << sp_ptr2->get_name() << std::endl;
    std::cout << "============" << std::endl;

    sp_ptr2.reset(sp_ptr1.get());
    std::cout << "sp1:" << sp_ptr1->get_name() << ", sp2:" << sp_ptr2->get_name() << std::endl;
    std::cout << "============" << std::endl;
}


这里我是没有通过智能指针对象共享所有权,但是我通过原始指针却做到了。Σ( ° △ °|||)︴
为了进一步证明这个玩意有问题,我们修改其中的一个值试试

class Student
{
public:
    Student(std::string name):m_name(name)
    {
        std::cout << "Student()..." << std::endl;
    }

    ~Student()
    {
        std::cout << "~Student()..." << std::endl;
    }

    void set_name(std::string name)
    {
        m_name = name;
    }

    std::string get_name()
    {
        return m_name;
    }

private:
    std::string m_name;
};

void func_scope()
{
    boost::scoped_ptr<Student> sp_ptr1(new Student("Jerry"));
    boost::scoped_ptr<Student> sp_ptr2(new Student("Jack"));
    std::cout << "sp1:" << sp_ptr1->get_name() << ", sp2:" << sp_ptr2->get_name() << std::endl;
    std::cout << "============" << std::endl;

    sp_ptr2.reset(sp_ptr1.get());
    std::cout << "sp1:" << sp_ptr1->get_name() << ", sp2:" << sp_ptr2->get_name() << std::endl;
    std::cout << "============" << std::endl;

    sp_ptr1->set_name("C Plus Plus");
    std::cout << "sp1:" << sp_ptr1->get_name() << ", sp2:" << sp_ptr2->get_name() << std::endl;
    std::cout << "============" << std::endl;
}


其实也不奇怪,都是指向同一个对像,感觉这个智能智能的实现和它的设计初衷相违背。
总之这个指针很有问题,尽可能少的在实际编程中去运用吧!

==========================补充=========================
之前有一次实验,发现内存被delete掉了以后,内存还能被访问,只是值不见了,这里查阅了一些资料,做了一下说明。
通过查阅,可能是因为这里的内存还没有被其他的程序申请,所以这里的内存还可用,我们的程序继续使用这块内存的时候是没有问题的,但是如果内存不够了,被其他的程序给申请了,这里的内存就不可用了,这时候就会崩溃了。这应该是我们经常说的未知的行为吧!delete 应该只是调了析构函数抹去了这块内存上的值,并且通知了操作系统这块内存可以被申请了。

原文地址:https://blog.51cto.com/11753138/2413388

时间: 2024-10-15 21:43:17

BOOST库日常挑刺 之 scope_ptr 传递所有权的相关文章

《超越C++标准库:Boost库导引》:序

序(Foreword) C++社区正在发生着一些美妙的事情.尽管C++仍然是世界上使用最广泛的编程语言,它依旧在变得更加强大而且易用.不信么?容我慢慢道来. 当前版本的标准C++是在1998年最终确定下来的,它为传统的过程式编程(procedural programming)以及面向对象和泛型编程(generic programming)提供了强有力的支持.正如老的(1998年以前的)C++单枪匹马地把面向对象引入软件开发者日常工作可及的范围那样,C++98针对泛型编程做了同样的事情.1990年

boost库在工作(15)绑定器与函数对象之三

前面已经可以优美地解决两个参数的函数给算法for_each调用了,但是又会遇到这样的一种情况,当需要三个参数或者三个以上的参数给算法for_each调用呢?从STL里的绑定器bind1st,显然是不行了,因为它最多只支持两个参数,那还有什么办法呢?这时就需要使用boost库里强大的绑定器bind了.它不仅适用的情况比STL库里的多,还更加方便,更加人性化.下面就来看看怎么样绑定三个参数的类成员函数的例子,如下: [cpp] view plaincopy //调用类的成员函数,但参数两个以上. /

boost库----share_from_this类的作用和实现原理

使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_this? 使用场合:当类A被share_ptr管理,且在类A的成员函数里需要把当前类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr. 我们就使类A继承enable_share_from_this,然后通过其成员函数share_from_this()返回当指向自身的share_ptr. 以上

boost库share_from_this类的作用和实现原理

使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_this? 使用场合 :当类A被share_ptr管理,且在类A的成员函数里需要把 当前类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr. 我们就使类A继承enable_share_from_this,然后通过其成员函数 share_from_this()返回当指向自身的share_ptr.

Boost库学习之旅入门篇

学习及使用Boost库已经有一段时间了,Boost为我的日常开发中带来了极大的方便,也使得我越来越依赖于boost库了.但boost功能太多,每次使用还是得翻看以前的 资料,所以为了以后可以更方便的使用,在此对常用的功能作一个总结,也希望以此与大家共勉. boost库下载,Svn地址: http://svn.boost.org/svn/boost/trunk 编译源码 编译boost库自带脚本解释工具: 使用vs自带命令行工具Visual Studio 命令提示(2010),运行bat脚本boo

(五)boost库之随机数random

(五)boost库之随机数random boost库为我们提供了许多的日常随机数生成器: 1.uniform_smallint:在小整数域内的均匀分布 2.uniform_int:在整数域上的均匀分布 3.uniform_01:在区间[0,1]上的实数连续均匀分布 4.uniform_real:在区间[min,max]上的实数连续均匀分布 5.bernoulli_distribution:伯努利分布 6.binomial_distribution:二项分布 7.cauchy_distributi

(十)boost库之多线程

(十)boost库之多线程 1.创建线程 使用boost库可以方便的创建一个线程,并提供最多支持9个参数的线程函数,相对于void*来说,方便了很多,创建线程主要提供了一下3种方式: 线程库头文件:#include <boost/thread.hpp> a.使用全局函数作为线程执行体 void Func(int nCount) { for (int i = 0; i < nCount; i++) { cout << __FUNCTION__ << i <&l

(四)boost库之正则表达式regex

(四)boost库之正则表达式regex 正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼 头文件: #include <boost/regex.hpp> 1.完全匹配 std::string str("abcd"); boost::regex reg( "a\\w*d" ); if (regex_match(str, reg)) { std::cout << str << " is match"

Boost库之bind的使用

 Boost库的bind是对STL的bind1st和bind2nd的进一步泛化,那么我们不免要问,bind相对于bind1st和bind2nd,都有哪些优点呢?下面通过一个具体的例子来说明这个问题. 假如有一个整数的容器vector,现在想找出容器中不大于10的元素的个数,那么我们可以有多种方式来实现: 1.    自由函数方式 BOOL LessEqualToTen(int nTemp) { return nTemp <= 10; } int nCount = count_if(vctTe