根据官方的介绍,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