某種情況下,我們完成了對空間的申請,程式某些問題或者異常的出現,對空間申請完成後並沒及時的釋放,導致記憶體洩漏。為此,出現了智慧型指標的概念,用過類的銷毀時呼叫析構函式的特性,將智慧型指標封裝成乙個類,在指標銷毀時,同時完成對其空間的釋放。
auto_ptr的缺陷是乙個指標給其他指標進行賦值或者拷貝時,會導致指標失效。
#pragma once
#include
template
t>
class
auto_ptr
auto_ptr
(auto_ptr
& ap)
:_ptr(ap._ptr)
auto_ptr
operator=(auto_ptr
& ap)
_ptr = ap._ptr;
ap._ptr = null;
}return *this;
}t& operator*()
t* operator->()
~auto_ptr
()
private:
t* _ptr;
};
scoped_ptr為了對auto_ptr優化,scoped_ptr採取了防止拷貝的手段。將其的拷貝構造和賦值運算子的過載只進行申明,並不定義,且將其設為private防止類外對其申明。
#pragma once
#include
templateclass scoped_ptr
~scoped_ptr()
t& operator*()
t* operator->()
private:
scoped_ptr(const scoped_ptr&);
scoped_ptroperator=(const scoped_ptr&);
private:
t* _ptr;
};
scoped_arry用於指向乙個陣列
#pragma once
#include
templateclass scopedarry
~scopedarry()
t& operator(const size_t pos)
private:
scopedarry(const scopedarry&);
scopedarry& operator=(const scopedarry&);
private:
t* _ptr;
};
shared_ptr為了使智慧型指標類更加接近指標的功能,shared_ptr採用了引用計數,防止同一塊空間被多個指標指向,導致一塊空間被釋放多次。
指向相同空間的指標都有相同的一塊區域來記錄該空間目前被多少指標管理。
引用計數只要沒有變為0,該空間就不會被釋放。
#pragma once
#include
#include"weak_ptr.h"
template
class shared_ptr
shared_ptr(const shared_ptr& sp)
:_ptr(sp._ptr)
, _refcount(sp._refcount)
shared_ptr& operator=(const shared_ptr& sp)
_ptr = sp._ptr;
_refcount = sp._refcount;
*_refcount++;
}return *this;
}~shared_ptr()
delete _refcount;}}
t& operator*()
t* operator->()
private:
t* _ptr;
int* _refcount;
};
shared_arry
#pragma once
#include
template
t>
class
sharedarry
sharedarry
(const
sharedarry
& sa)
:_ptr(sa._ptr)
, _refcount(sa._refcount)
~sharedarry
()
}sharedarry
& operator=(const
sharedarry
& sa)
_ptr = sa._ptr;
_refcount = sa._refcount;
*_refcount++;}}
t& operator(const
size_t& pos)
private:
t* _ptr;
int* _refcount;
};
shared_ptr實現以後,我們發現了一種場景
在這種場景下,我們最後的空間並沒有的到釋放。
n1需要釋放時,此時指向這塊空間的有n1和n2的prev,引用計數為2,引用計數減1。空間並沒有釋放。
當n2釋放時,管理此塊空間的有n2和n1的next,引用計數為2,引用計數減1。空間也沒得到釋放。
形成引用計數。
要解決引用計數的問題,我們引入weak_ptr輔助shared_ptr,並不增加引用計數,也不對指標進行管理。
#pragma once
#include
#include"shared_ptr.h"
templateclass weak_ptr
weak_ptr(const shared_ptr& sp)
:_ptr(sp._ptr)
{}t& operator*()
t* operator->()
private:
t* _ptr;
};
解決引用計數需要shared_ptr和weak_ptr配合使用。
#include
#include"shared_ptr.h"
struct node
;int main()
c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...
c 智慧型指標
很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...
c 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...