亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++內(nèi)存管理介紹

 更新時間:2022年01月06日 10:32:02   作者:?龍小  
這篇文章主要介紹了C++內(nèi)存管理,C++標準委員會給我們提供了auto_ptr智能指針,后面又引入了share_ptr以及weak_ptr幫助我們正確和安全的使用指針,本文主要是介紹boost庫提供的解決方案,需要的朋友可以參考一下

前言;

C++繼承了C語言的指針,一直以來指針的一些問題困擾著開發(fā)人員,常見的指針問題主要有:內(nèi)存泄露、野指針、訪問越界等。值得慶幸的是C++標準委員會給我們提供了auto_ptr智能指針,后面又引入了share_ptr以及weak_ptr幫助我們正確和安全的使用指針,本文主要是介紹boost庫提供的解決方案,期望通過本文能夠給你提供一個新的天地。

1 smart_ptr概述

在實際開發(fā)時,我們會根據(jù)不同的編程場景申請不同的資源,對于這些資源的管理需要一個完善的方案,我們希望在資源釋放后,C++能夠像java,c#一樣不用去手動的釋放資源而是由系統(tǒng)自動對資源進行回收。

1.1 RAII進制

C++編程時通常使用這種方法管理資源,申請的資源超過生命周期后,生命的對象自動調(diào)用析構(gòu)函數(shù)對資源進行正確回收。如此看來,似乎是完美的解決我們的問題,至少在使用時不用手動釋放資源。但是這種資源釋放的方法同樣存在著缺陷,如果對象是在棧上創(chuàng)建得到,那么會自動調(diào)用析構(gòu)函數(shù),結(jié)果也是沒有問題的,但是如果對象是通過new在堆上創(chuàng)建的呢?結(jié)果是析構(gòu)函數(shù)不能自動被調(diào)用,同樣需要我們使用delete進行顯示析構(gòu)。如果程序在執(zhí)行時沒有調(diào)用析構(gòu)delete進行釋放資源,那么同樣也會存在內(nèi)存泄露的風險。

new/delete在編程時一定要遵循配對原則,且要服從誰創(chuàng)建誰釋放的規(guī)則,這一點不管是新手程序員還是有著豐富編程經(jīng)驗的老手都要認真對待。

1.2 智能指針

從C98開始,C++標準委員會就給我們提供了智能指針:auto_ptr。它部分解決了資源的自動釋放問題。

使用方法如下:

std::auto_ptr<int> p (new int);

auto_ptr的構(gòu)造函數(shù)支持new操作符或者由對象工廠創(chuàng)建的對象指針作為參數(shù)。對象一經(jīng)創(chuàng)建就托管了原始指針,因此它可以使用get方法返回指針對象,如:

*p.get() = 100;

auto_ptr受到了大家的歡迎,越來越多的人使用這種技術(shù)解決了實際編程中大部分得到資源管理的問題,但是,auto_ptr并不是一種非常完善的技術(shù),也沒有覆蓋到智能指針的所有領(lǐng)域,尤其是引用計數(shù)型的智能指針。同理,在使用auto_ptr的時候也要注意以下幾點,避免auto_ptr的濫用。

  • auto_ptr不能共享所有權(quán),即不要讓兩個auto_ptr指向同一個對象。
  • auto_ptr不能指向數(shù)組,因為auto_ptr在析構(gòu)的時候只是調(diào)用delete。
  • auto_ptr只是一種簡單的智能指針,如有特殊需求,需要使用其他智能指針,比如share_ptr。
  • auto_ptr不能作為容器對象。

為了解決auto_ptr的不足,boost庫提供了多種類之中從而完善了auto_ptr的不足。這些指針都在boost庫的頭文件中,

如下所示:

#include <boost/smart_ptr.hpp>
using namespace boost;

1.3 scoped_ptr

該類型指針和auto_ptr類似,但是限制也更加嚴格,scoped_ptr對象一旦獲取對象的管理權(quán)就將一直占用,不能在進行管理權(quán)轉(zhuǎn)移。scoped_ptr像它的名字一樣,只能在起作用域內(nèi)進行使用。使用后會使得代碼相對簡單且不會增加多余操作。

scoped_ptr使用方法:

scoped_ptr使用簡單,只需要在原來使用new的地方用scoped_ptr進行替換即可,

使用方法如下:

scoped_ptr<string> pStr(new string("hello word"));

操作scoped_ptr指針也很簡單,使用方式和普通指針一致,如:

//打印指針指向字符串內(nèi)容
cout<<pAtr<<endl;
//打印字符長度
cout<<pAtr->size()<<endl;

需要注意的是:1)此指針對象會進行自動釋放,無需使用delete進行釋放,如果在實際編程時使用了delete,編譯器將會報錯,大家不妨可以思考下原因是什么歡迎留言。2)scoped_ptr是不能進行賦值、拷貝操作得到,生命周期只限于聲明的作用域內(nèi)。

和auto_ptr指針相比,scoped_ptr的不同點如下:

兩者都不能作為容器元素,但是原因卻不同。auto_ptr是因為它自身的轉(zhuǎn)義語義,但是scoped_ptr是因為不支持拷貝和復制。

指針所有權(quán)不同,auto_ptr是可以進行轉(zhuǎn)義得到,但是scoped_ptr不能進行轉(zhuǎn)義,因為其構(gòu)造和拷貝函數(shù)都是私有的。

1.4 scoped_array

scoped_arrayscoped_ptr基本相同,根本區(qū)別是scoped_array是指向數(shù)組的,封裝了new[],彌補了指向數(shù)組的智能指針。

scoped_array使用方法:

scoped_array和scoped_ptr設(shè)計思想相同,使用方法也基本一致,如下:

scoped_array<int> pIntArray(new int[10]);

使用時需要注意的是:scoped_array不會對數(shù)組范圍進行檢查,且不能通過數(shù)組名+偏移的方式進行獲取。

但可以按照以下方式使用:

pIntArray[0]=100;
pIntArray[1]=200;
1.5 shared_ptr

shared_ptr已經(jīng)被引入C++標準庫中,功能強大,可以像普通指針那樣使用,它是引用計數(shù)型指針,可以被任意的復制和拷貝。同時shared_ptr可以被用作容器元素。

可以說shared_ptr是C++歷史上實現(xiàn)智能指針算法中最杰出的代表作。

 shared_ptr使用方法:

shared_ptr指針是最接近原始指針的。他比auto_ptrscoped_ptr應(yīng)用范圍更廣,幾乎可以百分之百避免程序中的內(nèi)存泄露,但是使用卻又像auto_ptr和scoped_ptr一樣簡單。

shared_ptr是線程安全的,可以由多個線程進行讀取。

使用方式如下:

int main()
{
? ? //定義一個指針對象
? ?shared_ptr<int> pInt(new int);
? ?//對指針進行賦值
? ?*pInt = 100;
? ?cout<<*pInt<<endl;
? ?//調(diào)用shared_ptr重載方法
? ?shared_ptr<int> pInt_cp = pInt;
? ?cout<<*pInt_cp<<endl;
? ?pInt.reset();
? ?assert(!pInt);
? ?return 0;
}

如上代碼所示shared_ptr構(gòu)造函數(shù)中依舊使用new的方法創(chuàng)建一個對象,但這個遠遠不夠,shared_ptr提供make_shared方法來創(chuàng)建一個共享指針對象,

方式如下:

int main()
{
? ?shared_ptr<string> pStr= make_shared<string>("hello world");
? ?cout<<*pStr<<endl;
? ?shared_ptr<vector<int> > pVec = make_shared<vector<int> >(10,2);
? ?cout<<pVec->size()<<endl;
? ?return 0;
}

代碼輸出結(jié)果為:

hello world
10

shared_ptr高級用法;

shared_ptr 可以保存任意類型指針,可以理解成是改指針是泛型的。

shared_ptr<void *>退出作用域后調(diào)用回調(diào)函數(shù),如下:

void fun(void *p){}
shared_ptr<void *> p((void *0),fun);

除此之外,shared_ptr還有其它很多高級用法,如:延時釋放、包裝成員函數(shù)等,感興趣的話可以自行研究。

1.6 shared_array

shared_array功能和shared_ptr類似,根本區(qū)別是包裝了new[]操作符,可以指向數(shù)組,知道引用計數(shù)為0時才會進行釋放。

 shared_array使用方法:

shared_arrayshared_ptrscoped_array的結(jié)合體。

使用方法如下所示:

int main()
{
? ?int *p = new int[100];
? ?shared_array<int> sp(p);
? ?shared_array<int> sp1=sp;
? ?sp[0]=10;
? ?return 0;
}

1.7 weak_ptr弱指針

weak_ptr不具備普通指針的行為,需要和shared_ptr配合使用。主要用于協(xié)助shared_ptr工作,觀測資源的使用情況。

 weak_ptr使用方法:

weak_ptrshared_ptr共用可以通過shared_ptr或者weak_ptr對象構(gòu)造,使用時不會產(chǎn)生引用計數(shù)增加,析構(gòu)時也不會導致引用計數(shù)的減少??梢允褂胾se_count查看引用計數(shù),也可以使用其等效的方法expired(),如果引用計數(shù)為0則表示觀測的對已經(jīng)不存在了。代碼示例如下:

int main()
{
? ?shared_ptr<int> p(new int(100));
? ?cout<<p.use_count()<<endl;
? ?weak_ptr<int> wp(p);
? ?cout<<wp.use_count()<<endl;
? ?p.reset();
? ?if(!wp.expired())
? ?{
? ? ? ?shared_ptr<int> p1=wp.lock();
? ? ? ?*p1 = 1000;
? ? ? ?cout<<wp.use_count()<<endl;
? ?}
? ?return 0;
}

2 總結(jié)

如上,介紹了boost庫提供的幾種智能指針的方法、定義和使用,實際編碼時可以根據(jù)使用場景使用不同的指針,這里尤其要推的是shared_ptr,使用它幾乎可以解決我們遇到的所有使用場景。當然boost還提供了一種侵入式智能指針,但是因為其使用要求嚴格,官方已經(jīng)不再推薦使用,所以,本文也沒有進行介紹。

到此這篇關(guān)于C++內(nèi)存管理介紹的文章就介紹到這了,更多相關(guān)C++內(nèi)存管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt音視頻開發(fā)之通用監(jiān)控布局控件的實現(xiàn)

    Qt音視頻開發(fā)之通用監(jiān)控布局控件的實現(xiàn)

    這篇文章主要為大家詳細介紹了如何利用Qt開發(fā)一個通用的監(jiān)控布局控件,文中的示例代碼講解詳細,對我們學習Qt開發(fā)有一定的幫助,需要的可以參考一下
    2023-01-01
  • 重構(gòu)-C++實現(xiàn)矩陣的簡單實例

    重構(gòu)-C++實現(xiàn)矩陣的簡單實例

    下面小編就為大家?guī)硪黄貥?gòu)-C++實現(xiàn)矩陣的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • C語言位運算符:與、或、異或、取反、左移與右移詳細介紹

    C語言位運算符:與、或、異或、取反、左移與右移詳細介紹

    以下是對C語言中的位運算符:與、或、異或、取反、左移與右移進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • 純c實現(xiàn)異常捕獲try-catch組件教程示例

    純c實現(xiàn)異常捕獲try-catch組件教程示例

    這篇文章主要為大家介紹了純c實現(xiàn)異常捕獲try-catch組件教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Clion配置opencv開發(fā)環(huán)境的詳細過程

    Clion配置opencv開發(fā)環(huán)境的詳細過程

    這篇文章主要介紹了Clion配置opencv開發(fā)環(huán)境的詳細過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考的下
    2022-04-04
  • C++如何采用Daemon進行后臺程序的部署

    C++如何采用Daemon進行后臺程序的部署

    這篇文章主要介紹了C++采用Daemon進行后臺程序的部署,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • C語言浮點型數(shù)據(jù)在內(nèi)存中的存儲方式詳解

    C語言浮點型數(shù)據(jù)在內(nèi)存中的存儲方式詳解

    任何數(shù)據(jù)在內(nèi)存中都是以二進制的形式存儲的,例如一個short型數(shù)據(jù)1156,其二進制表示形式為00000100 10000100,下面這篇文章主要給大家介紹了關(guān)于C語言浮點型數(shù)據(jù)在內(nèi)存中的存儲方式,需要的朋友可以參考下
    2023-03-03
  • Qt與Web混合開發(fā)實現(xiàn)雙向通信的示例

    Qt與Web混合開發(fā)實現(xiàn)雙向通信的示例

    本文主要介紹了Qt與Web混合開發(fā)實現(xiàn)雙向通信的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • C++多線程編程超詳解

    C++多線程編程超詳解

    本文給大家介紹的是C++多線程編程,由于C++本身沒有多線程機制,在windows下我們使用調(diào)用SDK win32 api來實現(xiàn),示例都很簡單,講解的也很詳細,推薦給大家
    2021-09-09
  • 提升編程能力的C語言技巧總結(jié)

    提升編程能力的C語言技巧總結(jié)

    這篇文章主要為大家總結(jié)了一些C語言技巧的相關(guān)資料,可以幫助大家大大提升編程能力。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-12-12

最新評論