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;
}

BOOST库日常挑刺 之 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;

    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;
}

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

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

猜你喜欢

转载自blog.51cto.com/11753138/2413388
今日推荐