1. 程式人生 > >C++淺拷貝與深拷貝(程式設計師面試寶典試題)

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