C++(浅析)智能指针及C#GC(垃圾回收机制)分析[图]

C++(浅析)智能指针及C#GC(垃圾回收机制)分析[图]c++中我们常常使用运算符new和delete来分配和释放动态内存,然而动态内存的管理非常容易出错 使用new 和delete 管理内存存在三个常见问题: 1.忘记delete(释放) 内存。(或者异常导致程序过早退出,没有执行 delete)忘记释放动态内存会导致人们常说的 内存泄露 问题,你申请了内存而为归还给操作系统长时间这样会...
摘要由CSDN通过智能技术生成

C++(浅析)智能指针及C#GC(垃圾回收机制)分析[图]
c++中我们常常使用运算符new和delete来分配和释放动态内存,然而动态内存的管理非常容易出错 
使用new 和delete 管理内存存在三个常见问题: 
1.忘记delete(释放) 内存。(或者异常导致程序过早退出,没有执行 delete)忘记释放动态内存会导致人们常说的 内存泄露 问题,你申请了内存而为归还给操作系统长时间这样会导致系统内存越来越小。 
(内存泄露问题往往很难查找到,内存耗尽时,才能检测出这种错误) 
2.使用已经释放掉的对象。比如:我们使用delete释放掉申请的内存空间,但并未干掉指向这片空间的指针,此时指针指向的就是“垃圾”内存。 
3.同一块内存释放两次。当有两个指针指向相同的动态内存分配对象时,其中一个进行了delete操作 对象内存就还给了操作系统 ,如果我们要delete第二个指针,那么内存有可能遭到破坏(浅拷贝问题)
为了更容易同时也更安全的使用动态内存标准库为我们提供了 智能指针 来管理动态对象,智能指针的行为类似常规的指针,但是它并非指针,它是一个存储指向动态分配(堆)对象指针的类。 

C++(浅析)智能指针及C#GC(垃圾回收机制)分析[图]

这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针(释放管理的堆空间)。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放 
因为智能指针行为类似于指针 所以一般的指针行为智能指针也具备(每个智能指针重载了->和 *)
T& opertaor*(){
return *_ptr;   
} //这里返回了一个对象T 我们需要对T进行改动 所以返回T&
T* operator->(){
return _ptr; 
} //这里相当于是返回了一个指针,然后在使用这个指针指向一个内容
话不多说首先让我们来看第一种智能指针auto_ptr(管理权限转让) 
我们经常会遇到这种问题比如说浅拷贝的时候多个指针管理空间 但是当其中一个指针先结束释放了这块空间 ,那么当其他指针结束时在对这片空间进行释放 程序就会崩溃。 
为了方便解决上述问题我就可以使用智能指针auto_ptr 其主要原理是是在构造对象时赋予其管理空间的所有权,在拷贝或赋值中转移空间的所有权 拷贝和赋值后直接将_ptr赋为空,禁止其再次访问原来的内存空间。 
//auto_ptr的简单实现
template<class T>
class Autoptr
{
public:
Autoptr(T* ptr=NULL)
:_ptr(ptr)
{}
T* operator->()
{
return _ptr;
}
T& operator*()
{
return *_ptr;
}
Autoptr(Autoptr<T>& ap){ //拷贝构造
this->_ptr = ap._ptr;
ap._ptr = NULL;
}
Autoptr<T>& operator=(Autoptr<T>& ap){
if (this != &ap){
delete this->_ptr;
this->_ptr = ap._ptr;
ap._ptr = NULL;
}
return *this;
}
~Autoptr(){
if (_ptr){
cout << "释放空间le" << endl;
delete _ptr;
}
}
private:
T* _ptr;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值