C C 秋 春招技術崗面試基礎 深淺拷貝

2021-10-03 11:47:21 字數 1570 閱讀 4195

c++的拷貝方式、介紹了深淺拷貝的區別

先看一下下面的**(c++、vc6.0)

乙個person類, 乙個建構函式、乙個析構函式、乙個char * 成員變數,乙個 int成員變數。

建構函式:len是字串的長度,然後為指標p分配記憶體空間,長度為len+1,1是為了字串末尾的/0,然後strcpy進行字串拷貝

析構函式:當該類執行結束,收回記憶體空間是,判斷指標指向是否為空,不為空則釋放掉記憶體空間,為避免野指標,將p=null。

然後,執行!

#include

using

namespace std;

class

person

~person()

}private

:char

*p;int len;};

void

main()

執行中斷,發生錯誤,錯誤位置是main函式中 person obj2 = obj1;

分析錯誤原因: 定義obj1,為obj1.p在堆上分配了一塊空間,內容為helloworld。又定義了obj2,用obj1初始化obj2,此時沒有obj2沒有呼叫建構函式,而是呼叫了預設的拷貝建構函式,沒有為obj2.p分配記憶體空間,只是將obj2.p指向了obj1.p指向的記憶體空間。

char*的私有變數同時指向一塊位址 ,那麼一析構釋放記憶體那不炸了嗎?obj1析構函式就已經釋放掉了那塊記憶體,我obj2再析構就出錯了。這就是淺拷貝。又稱值拷貝,將源物件的值拷貝到目標物件中去,本質上來說源物件和目標物件共用乙份實體,只是所引用的變數名不同,位址其實還是相同的。也就是兩個指標指向了同一塊記憶體區域

那我們現在能讓他們公用一塊位址了,所以要改為深拷貝,修改拷貝建構函式。

#include

using

namespace std;

class

person

person

(const person& obj)

//拷貝建構函式

~person()

//析構函式

}private

:char

*p;int len;};

void

main()

手寫拷貝建構函式以後,執行成功。

分析:重寫拷貝建構函式以後,obj1的定義過程不變。obj2的用obj1初始化,呼叫拷貝建構函式。先將用obj1.len初始化obj2.len,緊接著為obj2.p分配的記憶體空間,然後又用obj1.p初始化obj2.p,這樣就不會出現兩個指標指向同一位址的情況,所以析構函式也能正常執行。

深拷貝,拷貝的時候先開闢出和源物件大小一樣的空間,然後將源物件裡的內容拷貝到目標物件中去,這樣兩個指標就指向了不同的記憶體位置。並且裡面的內容是一樣的,這樣不但達到了我們想要的目的,還不會出現問題,兩個指標先後去呼叫析構函式,分別釋放自己所指向的位置。即為每次增加乙個指標,便申請一塊新的記憶體,並讓這個指標指向新的記憶體,深拷貝情況下,不會出現重複釋放同一塊記憶體的錯誤

面經 秋 春招技術崗面經 死鎖

死鎖是指兩個或兩個以上的執行緒在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。1 互斥條件 程序在執行中對資源進行排他性使用,即乙個資源僅能被乙個程序使用,此時其他程序...

研發崗春招面試總結(一)

一年前的我從沒想過最後會成為一名客戶端開發程式媛 抱頭 2019 年的新年發生了很多事情,考研失敗,最喪的春天,廣州永遠不結束的夏天,校招小白剛開始寫簡歷卻收到春招尾聲的訊息,各種意外摻雜拿到一些offer,以及兜兜轉轉最後選擇了位元組跳動的 ios開發 在現實面前節節敗退,讓我很感恩拿到的offe...

2018騰訊春招技術崗面試程式設計題

題目描述 小q有x首長度為a的不同的歌和y首長度為b的不同的歌,現在小q想用這些歌組成乙個總長度正好為k的歌單,每首歌最多只能在歌單 現一次,在不考慮歌單內歌曲的先後順序的情況下,請問有多少種組成歌單的方法。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙個整數,表示歌單的總長度k 1...