0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++智能指針的學(xué)習(xí)方法介紹

Q4MP_gh_c472c21 ? 來源:CSDN博客 ? 作者:CSDN博客 ? 2020-09-02 13:54 ? 次閱讀

一、智能指針的學(xué)習(xí):

1、內(nèi)存泄漏:

關(guān)于內(nèi)存泄漏這個問題,一般都會牽扯到指針這個話題,也就是我們常說的動態(tài)內(nèi)存分配;然而在程序員手動進(jìn)行堆空間的分配時(指針無法控制所指堆空間的生命周期,),往往在寫完程序的時候,程序員一不小心就忘了釋放已經(jīng)手動分配的內(nèi)存大小,導(dǎo)致軟件Bug不斷(也就是內(nèi)存泄漏)。

C++語言里面又沒有垃圾回收的機(jī)制(不像高級語言Java有自動的垃圾回收機(jī)制,),所以程序員在寫程序的時候,經(jīng)常會發(fā)生剛才上面說的那種情況,這里我們來看一個例子:

#include 《iostream》

#include 《string》

using namespace std;

class Test

{

int i;

public

Test(int i)

{

this-》i = i;

}

int value()

{

return i;

}

~Test()

{

}

};

int main()

{

for(int i=0; i《5; i++)

{

Test* p = new Test(i);

cout 《《 p-》value() 《《 endl;

}

return 0;

}

輸出結(jié)果:

txp@ubuntu:~$ 。/a.out

0

1

2

3

4

注解:上面分配的堆空間,沒有釋放掉

2、我們需要什么?

需要一個特殊的指針: 智能指針對象,通過類的普通構(gòu)造函數(shù)完成;

指針生命周期結(jié)束的時候,主動釋放堆空間

一片堆空間最多只能由一個指針標(biāo)識:避免多次釋放內(nèi)存,通過拷貝構(gòu)造函數(shù)和賦值操作符完成;

杜絕指針運(yùn)算和指針比較

3、智能指針的使用:

重載指針特征操作符(-》和*)

只能通過類的成員函數(shù)重載

重載函數(shù)不能使用參數(shù)

只能定義一個重載函數(shù)

代碼實踐:

#include 《iostream》

#include 《string》

using namespace std;

class Test

{

int i;

public:

Test(int i)

{

cout 《《 “Test(int i)” 《《 endl;

this-》i = i;

}

int value()

{

return i;

}

~Test()

{

cout 《《 “~Test()” 《《 endl;

}

};

class Pointer

{

Test* mp;

public:

Pointer(Test* p = NULL)// 1,智能指針對象,通過類的普通構(gòu)造函數(shù)完成;

{

mp = p;

}

Pointer(const Pointer& obj)//避免多次釋放內(nèi)存,通過拷貝構(gòu)造函數(shù)和賦值操作符完成;

{

mp = obj.mp;// 傳遞堆空間的控制;

const_cast《Pointer&》(obj).mp = NULL;//初始化對象不管之前的;堆空間了,做所有權(quán)的轉(zhuǎn)移,保證堆空間最多只能由一個對象被標(biāo)識;

}

Pointer& operator = (const Pointer& obj)

{

if( this != &obj )

{

delete mp;

mp = obj.mp;

const_cast《Pointer&》(obj).mp = NULL;

}

return *this;

}

Test* operator -》 () // 返回指針,準(zhǔn)備指示;

{

return mp;

}

Test& operator * () // 解引用,返回對象;

{

return *mp;

}

bool isNull()

{

return (mp == NULL);

}

~Pointer()

{

delete mp;

}

};

int main()

{

Pointer p1 = new Test(0);

cout 《《 p1-》value() 《《 endl;

Pointer p2 = p1;

cout 《《 p1.isNull() 《《 endl;

cout 《《 p2-》value() 《《 endl;

return 0;

}

輸出結(jié)果:

txp@ubuntu:~$ 。/a.out

Test(int i)

0

1

0

~Test()

總結(jié)提示:智能指針是一個類,這個類的構(gòu)造函數(shù)中傳入一個普通指針,析構(gòu)函數(shù)中釋放傳入的指針。智能指針的類都是棧上的對象,所以當(dāng)函數(shù)(或程序)結(jié)束時會自動被釋放

二、總結(jié):

指針特征操作符(-》和*)可以被重載

重載指針特征符能夠使用對象代替指針

智能指針只能用指向堆空間中的內(nèi)存

智能指針的意義在于最大程度的避免內(nèi)存問題

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2113

    瀏覽量

    73742

原文標(biāo)題:C++之智能指針的學(xué)習(xí)總結(jié)

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    初學(xué)者該如何學(xué)習(xí)C++

    的錯誤學(xué)習(xí)方法,很多人認(rèn)為學(xué)習(xí)方法真的是一抓一大把,關(guān)于這些編程語言的學(xué)習(xí)方法,程序員總是非??鄲溃胍业揭粭l符合自己學(xué)習(xí)的道路其實并沒有想象中那么容易,初學(xué)者該如何
    發(fā)表于 05-22 16:41

    嵌入式學(xué)習(xí)方法步驟是什么?

    `嵌入式學(xué)習(xí)方法步驟是什么?我看一些初學(xué)者問的很多,分享一下。1.Linux基礎(chǔ)及C語言高級學(xué)習(xí)Linux基礎(chǔ)及C語言,對嵌入式C語言有一定
    發(fā)表于 10-22 15:23

    學(xué)習(xí)C++方法以及C++的就業(yè)方向

    學(xué)習(xí)方向:嵌入式+人工智能嵌入式是一門技術(shù)學(xué)習(xí)目標(biāo)1.嵌入式開發(fā)概述;(面向?qū)ο笤谇度胧介_發(fā)中角色)2.嵌入式Linux C++編程;(C++
    發(fā)表于 12-24 07:32

    模擬電子電路的學(xué)習(xí)方法

    模擬電子電路的學(xué)習(xí)方法
    發(fā)表于 08-07 15:49 ?254次下載
    模擬電子電路的<b class='flag-5'>學(xué)習(xí)方法</b>

    ZigBee 簡介和學(xué)習(xí)方法

    zigbee簡介以及學(xué)習(xí)方法,ZigBee的歷史發(fā)展前景。
    發(fā)表于 04-15 14:07 ?14次下載

    AVR單片機(jī)學(xué)習(xí)方法詳解

    詳細(xì)介紹AVR單片機(jī)學(xué)習(xí)方法,很適合初學(xué)者!
    發(fā)表于 05-16 17:15 ?3次下載

    C指針_CC++經(jīng)典著作

    C指針_CC++經(jīng)典著作,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-16 18:32 ?0次下載

    C++實驗--指針

    C++實驗--指針
    發(fā)表于 12-30 14:50 ?1次下載

    C++指針學(xué)習(xí)建議

    C++指針學(xué)習(xí)建議
    發(fā)表于 03-31 15:53 ?3次下載

    C++指針學(xué)習(xí)建議

     一。對于眾多人提出的c/c++指針難學(xué)的問題做個總結(jié):
    發(fā)表于 11-07 17:13 ?8次下載
    <b class='flag-5'>C++</b><b class='flag-5'>指針</b>的<b class='flag-5'>學(xué)習(xí)</b>建議

    C++封裝:this指針

    C++封裝:this指針
    的頭像 發(fā)表于 06-29 14:37 ?3491次閱讀
    <b class='flag-5'>C++</b>封裝:this<b class='flag-5'>指針</b>

    CC++經(jīng)典著作《C指針

    CC++經(jīng)典著作《C指針
    發(fā)表于 01-17 09:46 ?0次下載

    C++的引用和指針

    之前的文章我們已經(jīng)介紹C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復(fù)雜的數(shù)據(jù)類型復(fù)合類型,所謂的復(fù)合類型就是通過其他類型定義的類型,本篇文章我們將會著重
    的頭像 發(fā)表于 03-17 14:00 ?656次閱讀

    rust語言基礎(chǔ)學(xué)習(xí): 智能指針之Cow

    Rust中與借用數(shù)據(jù)相關(guān)的三個trait: Borrow, BorrowMut和ToOwned。理解了這三個trait之后,再學(xué)習(xí)Rust中能夠?qū)崿F(xiàn)寫時克隆的智能指針Cow。
    的頭像 發(fā)表于 05-22 16:13 ?2968次閱讀

    C++智能指針的底層實現(xiàn)原理

    C++智能指針的頭文件: #include 1. shared_ptr: 智能指針從本質(zhì)上來說是一個模板類,用類實現(xiàn)對指針對象的管理。 template class shared_pt
    的頭像 發(fā)表于 11-09 14:32 ?773次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>智能指針</b>的底層實現(xiàn)原理