C 智慧型指標

2021-08-07 16:26:46 字數 2904 閱讀 5138

先來看一段**:

void test()

//dosomething

delete p1;

}

以上存在在的問題我們可以在return之前釋放空間,也可以通過下面拋異常來解決這個問題,但是儘管如此,我們有時也很難避免記憶體洩漏,這時就引入了智慧型指標。

void dosomething ()

void test2 ()

catch(...)

//...

delete p1 ;

}

1:智慧型指標的發展歷史

auto_ptr/scoped_ptr/shared_pr/weak_ptr的設計思想、缺陷

auto_ptr:

template

class auto_ptr

auto_ptr(auto_ptr& ap) //拷貝建構函式

:_ptr(ap._ptr)

//當進行拷貝構造時,直接把ap._ptr賦值為null,將管理權交給_ptr

auto_ptr& operator=(auto_ptr& ap) //賦值運算子的過載

//把ap._ptr給_ptr,ap._ptr賦值為null,將管理權交給_ptr

-ptr = ap._ptr;

ap._ptr = null;

}return *this;

}~auto_ptr() //析構函式

}t* operator->()

t& operator*()

private:

t* _ptr;

};

當我們進行一般簡單的使用操作時並不會出現什麼問題,但是,因為auto_ptr的設計思想是管理權的轉移,當我們利用p1賦值或者拷貝構造給p2時,p1就會置null,當我們再去訪問舊的指標時就會出錯。

為了解決auto_ptr拷貝構造和賦值後對舊指標操作出錯問題,我們引入了scope_ptr,它的設計思想就是防拷貝,當使用者需要拷貝或者賦值時,程式直接報錯。我們模擬實現時,將拷貝構造和賦值運算子過載只宣告不實現,並將其設為私有。

template

t>

class

scoped_ptr

~scoped_ptr

()

}t* operator->()

t& operator*()

private:

//拷貝構造和賦值運算子過載只宣告不實現,並宣告為私有防止類外實現

scoped_ptr

(scoped_ptr

& sp);

scoped_ptr

& operator=(scoped_ptr

& sp);

t* _ptr;

};

shared_pr:

設計思想:引用計數,多個指標指向同一塊空間,

template

t>

class

shared_ptr

shared_ptr

(shared_ptr

& sp)

:_ptr(sp._ptr)

, _refcount(sp._refcount)

shared_ptr

& operator=(shared_ptr

& sp)

_ptr = sp._ptr;

_refcount = sp._refcount;

(*_refcount)++;

}return *this;

}shared_ptr

& operator=(shared_ptr

& sp)

~shared_ptr

()

}t* operator->()

t& operator*()

t* getptr

()

private:

t* _ptr;

int* _refcount;

};

然而,shared_ptr存在迴圈引用的缺陷問題:

struct listnode

};void test()

執行該程式可以看到,即使退出了test函式後,由於cur和next物件互相引用,它們的引用計數都是1,不能自動釋放,並且此時這兩個物件再無法訪問到。這就引起了記憶體洩漏。

一般來講,解除這種迴圈引用有下面有三種可行的方法:

1、當只剩下最後乙個引用的時候需要手動打破迴圈引用釋放物件。

2、當cur的生存期超過next的生存期的時候,next改為使用乙個普通指標指向cur。

3、使用弱引用的智慧型指標打破這種迴圈引用。

雖然這三種方法都可行,但方法1和方法2都需要程式設計師手動控制,麻煩且容易出錯。這裡主要介紹一下第三種方法。

weak_ptr:解決shared_ptr的迴圈引用問題,只負責管理,不負責釋放

templateclass weak_ptr

weak_ptr(const shared_ptr& sp)

:_ptr(sp._ptr)

{}t & operator*()

t & operator->()

private:

t* _ptr;

};

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 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...