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