【c++】模拟实现boost库里的scoped_ptr

//模拟实现boost下的scoped_ptr

#include <iostream>
#include <assert.h>
using namespace std;

template <class T>
class scoped_ptr
{
private:
	T * px;

	scoped_ptr(scoped_ptr const &);
	scoped_ptr& operator=(scoped_ptr const &);

	void operator==(scoped_ptr const &)const;
	void operator!=(scoped_ptr const &)const;
public:
	scoped_ptr(T *p = 0) :px(p)
	{}

	//从auto_ptr获得指针的管理权
	scoped_ptr(std::auto_ptr<T> p) :px(p.release())
	{}

	~scoped_ptr()
	{
		delete px;
	}

	// 删除原来的指针,保存新的指针
	void reset(T * p = 0)
	{
		assert(p == 0 || p != px);
		scoped_ptr<T>(p).swap(*this);
	}

	T& operator*()const
	{
		assert(px != 0);
		return *px;
	}

	T* operator->()const
	{
		assert(px != 0);
		return px;
	}

	T* get()const
	{
		return px;
	}

	void swap(scoped_ptr & b)
	{
		T *tmp = b.px;
		b.px = px;
		px = tmp;
	}
};

int main()
{
	int *p = new int(10);
	scoped_ptr<int> ptr(p);
	cout << *ptr << endl;
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 06:32:07

【c++】模拟实现boost库里的scoped_ptr的相关文章

【c++】简单模拟实现boost库下的shared-ptr

//简单模拟实现boost库下的shared_ptr #include <iostream> #include <string.h> using namespace std; class shared_ptr_Rep { friend class shared_ptr; public: shared_ptr_Rep(const char *str = " ") :count(0) { px = new char[strlen(str) + 1]; strcpy(

【c++】模拟实现boost库下的scoped_array

//模拟实现boost库下的scoped_array #include <iostream> #include <assert.h> using namespace std; template <class T> class scoped_array { private: T * px; scoped_array(scoped_array const &); scoped_array& operator=(scoped_array const &

boost库学习之 scoped_ptr scoped_array

boost.smart_ptr库提供了六种智能指针:scoped_ptr.scoped_array.shared_ptr.shared_array.week_ptr和intrusive_ptr. 说到智能指针,我们会想到c++98标准中的自动指针auto_ptr. auto_ptr获取指针所有权后,离开作用域时自动释放该指针指向的堆内存.也可以转移指针的所有权. auto_ptr<A> ap_a1(new A); auto_ptr<A> ap_a2(ap_a1); //发生所有权转

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

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

boost库在工作(39)网络UDP异步服务端之九

前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以选择,就是创建一个异步的UDP服务器或客户端,这样既有单线程的简单性,也可以让客户随便操作界面的快速响应的特性.在boost库里使用io_service对象来实现异步是轻而易举的事情,因为封装的接口简单.明了.具体的代码如下: [cpp] view plaincopy // boost_028.cp

C++ Primer 学习笔记_56_STL剖析(十一)(原boost库):详解智能指针(unique_ptr(原scoped_ptr) 、shared_ptr 、weak_ptr源码分析)

注意:现在boot库已经归入STL库,用法基本上还和boost类似 在C++11中,引入了智能指针.主要有:unique_ptr, shared_ptr, weak_ptr. 这3种指针组件就是采用了boost里的智能指针方案.很多有用过boost智能指针的朋友,很容易地就能发现它们之间的关间: std boost 功能说明 unique_ptr scoped_ptr 独占指针对象,并保证指针所指对象生命周期与其一致 shared_ptr shared_ptr 可共享指针对象,可以赋值给shar

Boost库中scoped_ptr

1.VC和VS VC版并不是标准C++,VS版符合标准C++,其语法相当严格. 缺点:VC和VS都只能释放一个具体类型空间,不能对数组空间进行释放,还有写时拷贝的问题:         所以引发了Boost库的出现来解决此类问题. 2.Boost库 推荐看一下Boost库完全开发指南. Boost本身是开源库,在C++中的地位举足轻重,第三章内存管理,智能指针: C++中也提供了智能指针,但是并不能解决所有问题. smart_ptr库中:new delete的运用不正确,是C++中造成资源获取/

详解Boost库智能指针(shared_ptr &amp;&amp; scoped_ptr &amp;&amp; weak_ptr )

我们先来解释一下什么叫智能指针? 智能指针是利用RAII(在对象的构造函数中执行资源的获取(指针的初始化),在析构函数中释放(delete 指针):这种技法把它称之为RAII(Resource Acquisition Is Initialization:资源获取即初始化))来管理资源. 其本质思想是:将堆对象的生存期用栈对象(智能指针)来管理.也就是当new一个堆对象的时候,立刻用智能指针来接管,具体做法是在构造函数中进行初始化(用一个指针指向堆对象),在析构函数调用delete来释放堆对象.由

模拟实现c++标准库和boost库中的智能指针

我们知道c++标准库中定义了智能指针auto_ptr,但是我们很少用它,因为虽然它能够自动回收动态开辟的内存,不需要程序员自己去维护动态开辟的内存,但是当用它去赋值或者是拷贝构造时有一个管理权转移的过程,这样我们就不能很方便的使用auto_ptr. 下面是简单的auto_ptr的实现,我们可以看到在复制和赋值时它将转移管理权. template<class T> class AutoPtr { public:      AutoPtr(T* ptr)       :_ptr(ptr)