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

淺談C++的淺拷貝出現的錯誤

 更新時間:2017年01月05日 09:33:58   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談C++的淺拷貝出現的錯誤。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

之前看一些資料提到淺拷貝的問題,即在復制對象時,只是對對象中的數據成員進行簡單的賦值,默認拷貝構造函數執(zhí)行的也是淺拷貝。如果對象中存在動態(tài)成員,如指針,那么僅僅做淺拷貝是不夠的,并且容易引發(fā)錯誤,最經典的例子:

#include <iostream>
#include <stdio.h> 

using namespace std;

class A{
  public:
    A(){m_p = new int(10);};
    ~A(){cout << "destruction function" << endl;delete m_p;}; 
    int* m_p; 
};

void copyTest(A atmp){
  ;
}

int main(){
  A a;
  copyTest(a);
}

執(zhí)行這段代碼會出現崩潰,因為析構函數里的delete m_p執(zhí)行了兩次,而m_p指向的是同一塊內存。因為在調用copyTest時傳入了對象a,atmp利用a作為參數執(zhí)行了默認拷貝構造函數,但是只是簡單地把對象a的m_p的內存地址拷貝給atmp的m_p,因此這個時候atmp.m_p只是指向了和a.m_p相同的內存塊。

當copyTest執(zhí)行完畢后,臨時變量atmp會被銷毀,這個時候析構函數被調用,delete了m_p指向的內存。而當main函數執(zhí)行完畢后,a對象也需要被銷毀,這個時候析構函數再次被執(zhí)行,而這個時候m_p已經不知道指向什么地方了,delete操作引發(fā)程序崩潰。

解決這個問題的方法有很多:一種方法是實現智能指針,對m_p進行引用計數,當引用值為0時才執(zhí)行delete;也可以每次把m_p的初始值設為NULL,每次執(zhí)行delete操作前先檢查m_p是否為NULL,delete后再讓m_p指向NULL,這個方法其實道理和智能指針差不多,只是智能指針更合理有效地利用類進行管理;還有一種做法是重寫拷貝構造函數,確保在對象復制時進行深拷貝,即重新分配內存空間,并且把a中m_p指向內存的內容拷貝到分配的空間。

以上這種情況只有在利用“值傳遞”復制對象時才發(fā)生,如果我們傳遞的是指針,就不會有這種情況了:

#include <iostream>
#include <stdio.h> 

using namespace std;

class A{
  public:
    A(){m_p = new int(10);};
    ~A(){cout << "destruction function" << endl;delete m_p;}; 
    int* m_p; 
};

void copyTest(A* atmp){
  ;
}

int main(){
  A* a;
  copyTest(a);
}

因為傳遞到copyTest的參數只是一個地址,指向的還是對象a,并沒有發(fā)生對象的復制,當然就不存在上面的深淺拷貝問題了。

以上就是小編為大家?guī)淼臏\談C++的淺拷貝出現的錯誤全部內容了,希望大家多多支持腳本之家~

相關文章

  • C++中的friend函數詳細解析

    C++中的friend函數詳細解析

    本篇文章主要介紹了C++中的friend函數詳細解析,對初學c++的人有一定的幫助,有需要的可以了解一下。
    2016-11-11
  • c++特殊構造函數詳解

    c++特殊構造函數詳解

    大家好,本篇文章主要講的是c++特殊構造函數詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++實現下載的代碼

    C++實現下載的代碼

    這篇文章主要介紹了C++實現下載的代碼,以下載百度圖片為例較為完整的講述了C++下載的具體實現方法,需要的朋友可以參考下
    2014-10-10
  • C語言 聯合(union)用法案例詳解

    C語言 聯合(union)用法案例詳解

    這篇文章主要介紹了C語言 聯合(union)用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C語言安全之數組長度與指針實例解析

    C語言安全之數組長度與指針實例解析

    這篇文章主要介紹了C語言安全之數組長度與指針,需要的朋友可以參考下
    2014-07-07
  • C語言如何實現翻轉字符串中的單詞

    C語言如何實現翻轉字符串中的單詞

    這篇文章主要介紹了C語言如何實現翻轉字符串中的單詞,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言實現BMP圖像處理(彩色圖轉灰度圖)

    C語言實現BMP圖像處理(彩色圖轉灰度圖)

    這篇文章主要為大家詳細介紹了C語言實現BMP圖像處理,彩色圖轉灰度圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++實現將輸入的內容輸出到文本文件

    C++實現將輸入的內容輸出到文本文件

    這篇文章主要介紹了C++實現將輸入的內容輸出到文本文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C/C++字節(jié)序的深入理解

    C/C++字節(jié)序的深入理解

    本文主要介紹了C/C++字節(jié)序的深入理解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語言中函數的聲明、定義及使用的入門教程

    C語言中函數的聲明、定義及使用的入門教程

    這篇文章主要介紹了C語言中函數的聲明、定義及使用的入門教程,重點講述了main函數的相關知識,需要的朋友可以參考下
    2015-12-12

最新評論