C++淺拷貝與深拷貝(程式設計師面試寶典試題)
#include<iostream> #include<cstdlib> #include<vector> #include<cstring> using namespace std; class CDemo{ public: CDemo():str(NULL){}; ~CDemo() { if(str) { delete[] str; } } char *str; }; int main(int argc,char** argv) { CDemo d1; d1.str=new char[32]; strcpy(d1.str,"trend micro"); vector<CDemo>*a1=new vector<CDemo>(); a1->push_back(d1); delete a1; return EXIT_SUCCESS; }
問題:找出以上程式錯誤的地方?(見p105-106)
分析
這個程式退出時會出問題,重複delete 同一片記憶體,程式崩潰。如果把解構函式改為如下,可以更清楚地看到這一點:
~CDemo()
{
if(str)
{
static int i=0;
cout<<"&CDemo"<<i++<<"="<<(int *)this<<", str="<<(int *)str<<endl;
delete[] str;
}
}
執行結果如下:
也就是說,發生了CDemo 類的兩次析構,兩次析構str 所指向的同一記憶體地址空間(兩次str 值相同=0x362e18)。
本問題歸根結底就是淺拷貝與深拷貝的問題。如果CDemo 類新增一個這樣的複製拷貝建構函式就可以解決問題:
CDemo(const CDemo &cd)
{
this->str=new char[strlen(cd.str)+1];
strcpy(str,cd.str);
}
改正之後的程式如下:
執行結果為:#include<iostream> #include<cstdlib> #include<vector> #include<cstring> using namespace std; class CDemo{ public: CDemo():str(NULL){}; CDemo(const CDemo &cd) { this->str=new char[strlen(cd.str)+1]; strcpy(str,cd.str); } ~CDemo() { if(str) { static int i=0; cout<<"&CDemo"<<i++<<"="<<(int *)this<<", str="<<(int *)str<<endl; delete[] str; } } char *str; }; int main(int argc,char** argv) { CDemo d1; d1.str=new char[32]; strcpy(d1.str,"trend micro"); vector<CDemo>*a1=new vector<CDemo>(); a1->push_back(d1); delete a1; return EXIT_SUCCESS; }
新增深複製拷貝建構函式就可以解決問題了。
相關推薦
C++淺拷貝與深拷貝(程式設計師面試寶典試題)
#include<iostream> #include<cstdlib> #include<vector> #include<cstring> using namespace std; class CDemo{ publi
.net概述---from《C#與.net程式設計師面試寶典》
1、介紹APS.NET ASP.NET不是一種語言,而是建立動態web頁的一種伺服器端技術,是Microsoft .NET Framework中一套用於生成web應用程式和web服務的技術。可以使用相容語言編寫web服務檔案中的伺服器端,是提供web應用服務的程式設計框架。
[C/C++程式設計師面試寶典] (07)-翻轉句子中單詞的順序
點選此處檢視原文 題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。 例如輸入“I am a student.”,則輸出“student. a am I”。 分析:由於編寫字串相關程式碼能夠反映程式設計師
程式設計師面試寶典筆記(歐立奇版)
printf()函式計算引數是從右向左入棧的。 *(ptr++)+=123;含義為*ptr=*ptr+123;ptr++;//括號的優先順序比*低 float a=1.0f; cout<<(int&)a<<endl; //浮點數在記憶體裡和整數的儲存方式不同
程式設計師面試寶典隨筆記(一)----計算機網路知識點梳理
傳輸層概 作用:傳輸層為它上面的應用層提供通訊服務。 在OSI七層參考模型中,傳輸層是面向通訊的最高層,也是使用者功能的最底層。 傳輸層兩大重要的功能:複用 和 分用。 複用:在傳送端,多個應
程式設計師面試寶典隨筆記(一)--記憶體管理詳解
記憶體管理是C++最令人切齒痛恨的問題,也是C++最有爭議的問題,C++高手從中獲得了更好的效能,更大的自由,C++菜鳥的收穫則是一遍一遍的檢查程式碼和對C++的痛恨,但記憶體管理在C++中無處不在,記憶體洩漏幾乎在每個C++程式中都會發生,因此要想成為C++高手,記
程式設計師面試寶典隨筆記(一)---執行緒和程序1,-基礎資訊
①程式,程序,執行緒的區別 程式:程式是由一系列的指令和邏輯組成的一個靜態檔案(如cpp檔案),無論能不能執行,它都客觀的存在於儲存器中。 程序:程序是計算機中的程式關於某資料集合
程式設計師面試寶典(第5版)
網站 更多書籍點選進入>> CiCi島 下載 電子版僅供預覽及學習交流使用,下載後請24小時內刪除,支援正版,喜歡的請購買正版書籍 電子書下載(皮皮雲盤-點選“普通下載”) 購買正版 封頁 編輯推薦 揭開知名IT企業面試、筆試
Java程式設計師面試寶典(第4版)
網站 更多書籍點選進入>> CiCi島 下載 電子版僅供預覽及學習交流使用,下載後請24小時內刪除,支援正版,喜歡的請購買正版書籍 電子書下載(皮皮雲盤-點選“普通下載”) 購買正版 封頁 編輯推薦 揭開知名IT企業面試、筆試
Java程式設計師面試寶典筆記記錄(終)-第9章海量資料部分筆記
前言 本次博文對何昊出版的《java程式設計師面試寶典》的第9章海量資料部分的概括筆記,刪除部分內容,是本系列筆記部落格的最後一個博文。 相關知識 Hash法 對映關係,給定資料元素,關鍵字是
程式設計師面試寶典(第三版)——單鏈表的基本操作:建立,求長度,輸出,排序,插入,刪除,逆置
程式設計實現一個單鏈表的建立,求單鏈表的長度,列印輸出單鏈表,對單鏈表進行排序,插入元素,刪除元素,對單鏈表進行逆置。 我是借鑑參考資料,然後自己寫規範,對函式都進行了呼叫,每一次呼叫,都有輸出單鏈表。程式完整,已除錯執行。 源程式: #include<iostrea
程式設計師面試寶典隨筆記(一)-----TCPIP和socket程式設計面試技巧
****能進行網路程式設計***** 1.如果你說你會select,epoll,iocp模型,那會讓對方覺得更靠譜 2.如果你說出你做過im,下載之類那會讓對方來興趣. 3.如果你說設計了通訊協議
c++程式設計師面試寶典
靜態儲存區 static靜態變數 全域性變數 棧 區域性變數 堆 動態分配的 棧堆:迴圈的迭代用中 資料量大 則溢位 239 static作用:靜態變數的生存週期和作用域http://blog.csdn.net/qibanxuehua/article/
《Java程式設計師面試寶典(第4版)》試讀感想
作為一名java程式設計師,已經有幾年經驗了,但是試讀章節的題目在看答案之前也自己做了一下,基本沒有做對一道題目,雖然有經驗,但是基礎的東西在平時工作用的少,或者一些實現方式或寫法根本沒有這樣寫過,所以這些題目答錯在所難免了。 面試寶典,顧名思義它的核心在於面試,往往
程式設計師面試寶典(12)-從上往下遍歷二元樹
http://www.itmian4.com/thread-6009-1-1.html 題目:輸入一顆二元樹,從上往下按層列印樹的每個結點,同一層中按照從左往右的順序列印。 例如輸入 &n
最近整理的一些常見的面試題,面試大全,黑馬程式設計師面試寶典題庫---最新技術--篇
第八章 最新技術(評論區留言獲取原件) 一、 Redis 1. Redis 的特點? Redis 是由義大利人 Salvatore Sanfilippo(網名: antirez)開發的一款記憶體快取記憶體資料庫。 Redis
最近整理的一些常見的面試題,面試大全,黑馬程式設計師面試寶典題庫---框架--篇
框架(評論留言獲取原件) 一、 SpringMVC 1. SpringMVC 的工作原理 a. 使用者向伺服器傳送請求,請求被 springMVC 前端控制器 DispatchServlet 捕獲; b. DispatcherServle 對請求 URL 進行解析,得到請求資源
最近整理的一些常見的面試題,面試大全,黑馬程式設計師面試寶典題庫---資料庫--篇
一、 Mysql 1. SQL 的 select 語句完整的執行順序 SQL Select 語句完整的執行順序: 1、 from 子句組裝來自不同資料來源的資料; 2、 where 子句基於指定的條件對記錄行進行篩選; 3、 group by 子句將資料劃分為多個分組; 4、使用聚集
最近整理的一些常見的面試題,面試大全,黑馬程式設計師面試寶典題庫---JavaWEE高階篇
一、 Filter 和 Listener(評論留言獲取原件) 可參見:https://www.cnblogs.com/libingbin/p/5985647.html 二、 AJAX 1. 談談你對 ajax 的認識? Ajax 是一種建立互動式網頁應用的的網頁開發技術;
最近整理的一些常見的面試題,面試大全,黑馬程式設計師面試寶典題庫---JavaWEB基礎篇
一、 JDBC 技術(評論留言獲取原件) 1. 說下原生 jdbc 操作資料庫流程?(2017-11-25-wzz) 第一步: Class.forName()載入資料庫連線驅動; 第二步: DriverManager.getConnection()獲取資料連線物件; 第三步:根據 SQL