欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++基礎(chǔ)教程之指針拷貝詳解

 更新時(shí)間:2017年01月28日 11:03:48   投稿:lqh  
這篇文章主要介紹了C++基礎(chǔ)教程之指針拷貝詳解的相關(guān)資料,需要的朋友可以參考下

C++基礎(chǔ)教程之指針拷貝詳解

 指針是編程人員的夢(mèng)魘,對(duì)C語(yǔ)言的開發(fā)者是如此,對(duì)C++的開發(fā)者也是如此。特別是在C++中,如果不注意處理類中的指針,非常容易出問題。如果朋友們不相信可以看看下面的代碼:

class data 
{ 
 int* value; 
public: 
 data(int num){ 
 if(num > 0) 
  value = (int*)malloc(sizeof(int)* num); 
 } 
 
 ~data(){ 
 if(value) 
  free(value); 
 } 
}; 
 
void process() 
{ 
 data m(10); 
 data p = m; 
} 

    上面的這段問題有沒有什么問題?大家可以自己先用筆在草稿紙上面畫一畫。然后上機(jī)用實(shí)際環(huán)境驗(yàn)證一下。果不其然,系統(tǒng)提示內(nèi)存發(fā)生了錯(cuò)誤。為什么呢?就是因?yàn)閮?nèi)存發(fā)生了兩次釋放。我們看以看一下process的匯編代碼:

21: data m(10); 
0040105D push 0Ah 
0040105F lea  ecx,[ebp-10h] 
00401062 call @ILT+15(data::data) (00401014) 
00401067 mov  dword ptr [ebp-4],0 
22: data p = m; 
0040106E mov  eax,dword ptr [ebp-10h] 
00401071 mov  dword ptr [ebp-14h],eax 
23: } 
00401074 lea  ecx,[ebp-14h] 
00401077 call @ILT+5(data::~data) (0040100a) 
0040107C mov  dword ptr [ebp-4],0FFFFFFFFh 
00401083 lea  ecx,[ebp-10h] 
00401086 call @ILT+5(data::~data) (0040100a) 
0040108B mov  ecx,dword ptr [ebp-0Ch] 
0040108E mov  dword ptr fs:[0],ecx 
00401095 pop  edi 
00401096 pop  esi 
00401097 pop  ebx 
00401098 add  esp,54h 
0040109B cmp  ebp,esp 
0040109D call __chkesp (004015b0) 
004010A2 mov  esp,ebp 
004010A4 pop  ebp 
004010A5 ret 

    21行: data調(diào)用構(gòu)造函數(shù),分配內(nèi)存給value

    22行: 這里我們發(fā)現(xiàn)程序進(jìn)行內(nèi)存拷貝,那么表示m變量value的數(shù)值和p變量中value的數(shù)值是一樣的

   23行:這里函數(shù)即將結(jié)束,所以系統(tǒng)調(diào)用m和p的析構(gòu)函數(shù),第一次析構(gòu)的時(shí)候value指向的內(nèi)存被釋放,第二次析構(gòu)的時(shí)候由于p變量value的數(shù)值非0,所以也需要釋放內(nèi)存,當(dāng)然也需要進(jìn)行析構(gòu)處理,但是此時(shí)內(nèi)存已經(jīng)釋放了,所以內(nèi)存進(jìn)行了二次釋放,系統(tǒng)報(bào)錯(cuò)。 

   經(jīng)過上面的研究,我們發(fā)現(xiàn)了問題和原因,那么應(yīng)該怎么解決呢?既然問題是在拷貝函數(shù)這里,那么就要對(duì)拷貝函數(shù)進(jìn)行特殊處理。目前就我個(gè)人理解,有兩個(gè)方法供大家選擇:

    (1)對(duì)拷貝構(gòu)造函數(shù)進(jìn)行private處理,這樣一旦出現(xiàn)了拷貝操作,編譯器就會(huì)提示出錯(cuò)。

class data 
{ 
 int* value; 
 data(const data&) ; 
public: 
 data(int num){ 
 if(num > 0) 
  value = (int*)malloc(sizeof(int)* num); 
 } 
 
 ~data(){ 
 if(value) 
  free(value); 
 } 
}; 

   (2)編寫拷貝構(gòu)造函數(shù),進(jìn)行內(nèi)存深復(fù)制

class data 
{ 
  int* value; 
  int number; 
public: 
  data(int num){ 
    if(num > 0) 
      value = (int*)malloc(sizeof(int)* num); 
    number = num; 
  } 
 
  data(const data& d){ 
    if(NULL != d.get_ptr()) 
      value = (int*) malloc(sizeof(int)* d.get_number()); 
    number = d.get_number(); 
    memmove(value, d.get_ptr(), sizeof(int)* number); 
  } 
 
  ~data(){ 
    if(value) 
      free(value); 
  } 
 
  int* get_ptr() const{ return value;} 
  int get_number() const {return number;} 
}; 

  我們看到,經(jīng)過拷貝構(gòu)造函數(shù)的定義后,原來的process函數(shù)解可以正常編譯通過,沒有問題。

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C++中map和set的使用及示例

    C++中map和set的使用及示例

    map和set是STL容器中的部分,本文主要介紹了C++中map和set的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • C/C++實(shí)現(xiàn)投骰子游戲

    C/C++實(shí)現(xiàn)投骰子游戲

    這篇文章主要為大家詳細(xì)介紹了C/C++實(shí)現(xiàn)投骰子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 矩陣的行主序與列主序的分析

    矩陣的行主序與列主序的分析

    這篇文章主要介紹了矩陣的行主序與列主序的分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測(cè)

    Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++中給二維指針分配內(nèi)存(實(shí)現(xiàn)代碼)

    C++中給二維指針分配內(nèi)存(實(shí)現(xiàn)代碼)

    我們都知道在 C++ 中分配動(dòng)態(tài)數(shù)組用的是 new , 撤銷動(dòng)態(tài)數(shù)組用的是 delete[ ] ,現(xiàn)在讓我們來看看怎么利用這兩個(gè)關(guān)鍵字給二維指針分配內(nèi)存
    2013-10-10
  • C++實(shí)現(xiàn)高性能轉(zhuǎn)換大小寫算法示例

    C++實(shí)現(xiàn)高性能轉(zhuǎn)換大小寫算法示例

    大小寫轉(zhuǎn)換是我們作為一名程序員經(jīng)常會(huì)遇到,也必須要會(huì)的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)高性能轉(zhuǎn)換大小寫算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-01-01
  • C/C++實(shí)現(xiàn)圖書信息管理系統(tǒng)

    C/C++實(shí)現(xiàn)圖書信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了c/c++實(shí)現(xiàn)圖書信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 聊聊c++數(shù)組名稱和sizeof的問題

    聊聊c++數(shù)組名稱和sizeof的問題

    這篇文章主要介紹了c++數(shù)組名稱和sizeof,介紹了一維數(shù)組名稱的用途及二維數(shù)組數(shù)組名,通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • 獲取C++變量類型的簡(jiǎn)單方法

    獲取C++變量類型的簡(jiǎn)單方法

    這篇文章主要介紹了獲取C++變量類型的簡(jiǎn)單方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • c++定義全局變量詳解

    c++定義全局變量詳解

    這篇文章主要給大家介紹了C++語(yǔ)言中定義全局變量,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2021-10-10

最新評(píng)論