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 應該只是調了析構函數抹去了這塊內存上的值,並且通知了操作系統這塊內存可以被申請了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章