智能指针(四)之shared_ptr
2017-11-12 12:15
302 查看
1.auto_ptr:采用管理权转移的方法 ,防止拷贝后析构释放同一块内存
2scoped_ptr:禁止拷贝和赋值
3shared_ptr:要想使用拷贝构造,赋值运算符,但是析构的时候不会报错,我们想到了使用引用计数的方法,使得析构函数只释放一次内存。每次构造时,使引用计数count++,析构时看count是否为一,若不为一--count;若为宜则释放空间。
代码实现
template<class T>
class Sharedptr
{
public:
Sharedptr(T* ptr = NULL)
:_ptr(ptr)
, _count(NULL)
{
if (ptr != NULL)
{
_count = new int(1);
}
}
Sharedptr(const Sharedptr& s)//拷贝构造
:_ptr(s._ptr)
, _count(s._count)
{
if (s._ptr != NULL)
{
++(*_count);
}
}
Sharedptr &operator= (const Sharedptr& s)
{
if (_ptr != s._ptr)
{
Sharedptr tmp(s);
std::swap(_ptr,tmp._ptr);
std::swap(_count, tmp._count);
}
return *this;
}
~Sharedptr()
{
if (_count!=NULL && *_count == 1)
{
delete _ptr;
delete _count;
_ptr = NULL;
_count = NULL;
}
else
--(*_count);
}
private:
T* _ptr;
int *_count;
};
int main()
{
Sharedptr<int> s1(new int(10));
Sharedptr<int> s2(new int(20));
Sharedptr<int> s3(s1);
s2 = s1;
system("pause");
return 0;
}
2scoped_ptr:禁止拷贝和赋值
3shared_ptr:要想使用拷贝构造,赋值运算符,但是析构的时候不会报错,我们想到了使用引用计数的方法,使得析构函数只释放一次内存。每次构造时,使引用计数count++,析构时看count是否为一,若不为一--count;若为宜则释放空间。
代码实现
template<class T>
class Sharedptr
{
public:
Sharedptr(T* ptr = NULL)
:_ptr(ptr)
, _count(NULL)
{
if (ptr != NULL)
{
_count = new int(1);
}
}
Sharedptr(const Sharedptr& s)//拷贝构造
:_ptr(s._ptr)
, _count(s._count)
{
if (s._ptr != NULL)
{
++(*_count);
}
}
Sharedptr &operator= (const Sharedptr& s)
{
if (_ptr != s._ptr)
{
Sharedptr tmp(s);
std::swap(_ptr,tmp._ptr);
std::swap(_count, tmp._count);
}
return *this;
}
~Sharedptr()
{
if (_count!=NULL && *_count == 1)
{
delete _ptr;
delete _count;
_ptr = NULL;
_count = NULL;
}
else
--(*_count);
}
private:
T* _ptr;
int *_count;
};
int main()
{
Sharedptr<int> s1(new int(10));
Sharedptr<int> s2(new int(20));
Sharedptr<int> s3(s1);
s2 = s1;
system("pause");
return 0;
}
相关文章推荐
- 几种智能指针的比较(std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::weak_ptr)
- C++智能指针 shared_ptr 与 weak_ptr 原理
- [6]智能指针boost::shared_ptr
- C++ TR1 智能指针shared_ptr的使用(转)
- c++智能指针:auto_ptr shared_ptr
- 九、 通用工具 ----smart Pointer(智能指针)---shared_ptr 指针
- 【C++】智能指针shared_ptr 定位删除器(仿函数)
- 智能指针 std::auto_ptr 和 shared_ptr
- [置顶] 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- 智能指针shared_ptr的用法
- 【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr,scoped_array,shared_array
- 智能指针之shared_ptr
- C++11 FAQ中文版:共享资源的智能指针——shared_ptr
- 智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr
- 对shared_ptr智能指针的功能代码实现和测试
- C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)
- 智能指针(auto_ptr 和 shared_ptr)
- 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- 智能指针(auto_ptr 和 shared_ptr)
- C++11 智能指针——shared_ptr