1. 程式人生 > >C++Primer第五版 第十二章習題答案(1~10)

C++Primer第五版 第十二章習題答案(1~10)

1:知識點1:物件生命週期:全域性物件在程式啟動時分配,在程式結束時銷燬。區域性自動物件,當我們進入其定義所在程式塊時被建立,在離開塊時被銷燬。區域性static物件在第一次使用前分配,在程式結束時銷燬

知識點2:除了static和自動物件外,C++還支援動態物件的分配。動態分配的物件的生存期與它們在哪裡建立無關,只有被顯示的釋放時,這些物件才會被銷燬

知識點3:動態物件的釋放是程式設計中極其容易出問題的地方,為了安全使用動態物件,標準庫定義了兩個智慧指標型別來管理動態分配物件,當一個物件應該被釋放時,指向它的智慧指標可以確保自動釋放它

知識點4:靜態記憶體:儲存區域性static物件、類static物件、定義在任何函式之外的物件,由編譯器自動建立和銷燬。棧記憶體:儲存定義在函式之內的非static物件,棧物件僅在定義的程式塊執行時才存在

知識點5:除了靜態記憶體和棧記憶體,每個程式還擁有一個記憶體池,這部分記憶體被稱為自由空間或堆,程式用堆來儲存動態分配的物件:在程式執行時分配的物件,其生存週期由程式來控制,也就是說,當動態物件不再使用時,我們必須顯式的銷燬:必須正確的管理動態記憶體

知識點6:C++中動態記憶體的管理是通過一對運算子來完成的,new:在動態記憶體中為物件分配空間並返回一個指向該物件的指標。delete:接受一個動態物件的指標,銷燬該物件,並釋放與之關聯的記憶體

知識點7:忘記釋放記憶體:記憶體洩漏,在尚有指標引用記憶體的情況下釋放了記憶體,就會產生引用非法記憶體的指標

知識點8:為了更安全的使用動態記憶體,新標準庫定義了兩種智慧指標型別來管理動態物件,標頭檔案為memory,智慧指標的主要作用就是自動釋放所指向的物件,shared_ptr型別允許多個指標指向同一物件,unique_ptr型別則獨佔所指向物件

知識點9:智慧指標類似與vector,用法上有相同的地方,下面是shared_ptr的定義方式

shared_ptr<string> p1;//定義一個智慧指標,指向物件為string型別
shared_ptr<list<int>> p2;

vector<string> p1;//智慧指標也是模版
vector<list<int>> p2;

知識點10:智慧指標的使用方式與內建型別指標相似,解引用也是返回所指向物件,若在條件判斷中使用,檢測其是否為空

知識點11:make_shared()函式:最安全的分配和使用動態記憶體的方法,此函式在動態記憶體中分配一個物件並初始化它,返回指向該物件的shared_ptr,標頭檔案為memory

shared_ptr<int> p3 = make_shared<int>(42);//p3為智慧指標,指向一個值為42的物件
auto p3 = make_shared<int>(42);//利用auto比較簡便,若不傳遞任何引數,會值初始化

知識點12:每個shared_ptr都有一個關聯的計數器,稱為引用計數,個人理解就是該物件被引用的次數,拷貝情況下會遞增:

1:用一個shared_ptr初始化另一個shared_ptr(拷貝)

2:將一個shared_ptr傳遞給一個函式當引數,值傳遞(拷貝)

3:作為函式的返回值,(返回的是自身的拷貝,也就是活引用的次數+1)

計數器遞減情況:

1:給shared_ptr賦予一個新值(也就是說自身指向了另外一個地址,原來指向的物件已經沒有引用者,則會自動釋放)

2:一個shared_ptr離開其作用域時,會被銷燬(遞減)

當一個shared_ptr的計數器變為0,他就會自動釋放自己所管理的物件,前提是其指向的物件只有一個引用者。

知識點13:當指向一個物件的最後一個shared_ptr被銷燬時,該物件會被自動銷燬:利用解構函式,會遞減該物件的引用計數,當引用次數變為0,會銷燬該物件

知識點14:相關聯記憶體是否銷燬:所有指向該記憶體的shared_ptr物件都被銷燬,也就是計數器為0

知識點15:使用動態記憶體的原因:讓多個物件共享相同的底層資料。也就是說拷貝的情況雖然發生,但是並不是元素的拷貝,而是將本身的指向拷貝給另一個指標物件,讓這一個物件也指向自己所指向的物件,這樣在本身釋放以後,還有另一個物件指向自身原來所指向的物件。

由知識點15:b1和b2都包含4個元素。

2:直接在函式宣告之後加const即可~

3:是否要定義為const版本取決於是否需要加以修改,這兩個函式都不會對引數進行修改,所以無需加const

4:因為data_size的型別為size_type,是一個無符號型別,即使是負數,也會自動轉化為非負。

5:explicit的作用就是抑制建構函式的隱式轉換

優點:不會自動的進行型別轉換,必須清楚的知道類型別

缺點:必須用建構函式顯示建立一個物件,不夠方便簡單

6:知識點1:new和delete相對於智慧指標來說非常容易出錯,最好使用智慧指標來管理動態記憶體

知識點2:在自由空間分配的記憶體是無名的,因此new無法為其分配物件命名,而是返回指向該物件的指標

知識點3:預設情況下,new分配的物件是預設初始化的,這就說明內建型別或者組合型別將是為定義的(l例如:int,會指向一個為初始化的int),類型別物件將用預設建構函式進行初始化(例如string,會產生一個空string)。

知識點4:建議使用值初始化(在最後加一對小括號即可),值初始化的內建型別物件有著良好定義的值

知識點5:auto只有單一引數時可以使用,可以使用new分配const物件

知識點6:delete完成兩個操作:銷燬給定指標所指向的物件,釋放對應的記憶體,delete的引數必須是指向動態分配的物件或是一個空指標。

知識點7:內建型別指標管理的動態記憶體在被顯式的釋放前一直都會存在,因為內建型別與類型別不同,雖然內建型別的指標會在離開作用域後被銷燬,但是其記憶體依然存在

知識點8:同一塊記憶體釋放兩次:兩個內建型別的指標指向同一塊自由空間分配的記憶體,在對一個指標進行delete之後,其指向的記憶體也會被釋放,若再對第二個指標進行delete,會造成自由空間破壞

知識點9:忘記使用delete,使用已經釋放掉的物件都是經常發生的(使用new和delete時),所以儘可能的使用智慧指標

知識點10:在很多機器上,即使delete了某個內建型別的指標(也就是說釋放了對應的記憶體空間),雖然指標已經無效,但是其仍然保留這釋放空間的對應地址,變成了空懸指標,也就是說我們要保留指標,可以將其置為空指標

7:智慧指標的版本只是不需要在程式結束時進行delete操作

#include <iostream>  
#include <string>  
#include <vector>
#include<memory>
#include<list>
using namespace std;  

//返回一個動態分配的vector,看第六題的意思是不用只能指標,那麼將型別改為vector<int> *就好了
shared_ptr<vector<int>> vector_i()
{
	
	shared_ptr<vector<int>> _ptr(new vector<int>);
	return _ptr;
}

//給vector賦值
void vector_j(shared_ptr<vector<int>> _ptr)
{
	int int_val;
	while (cin>>int_val)
	{
		_ptr->push_back(int_val);
	}
}

//列印vector的值
void vector_k(shared_ptr<vector<int>> _ptr)
{
	for (size_t i = 0; i < (*_ptr).size(); ++i)
	{
		cout<<(*_ptr)[i]<<endl;
	}
}

int main(int argc,char **argv)  
{
	shared_ptr<vector<int>> my_ptr = vector_i();
	vector_j(my_ptr);
	vector_k(my_ptr);
	return 0;
}  


8:p是一個內建型別的指標,返回p會使得p的型別轉化為bool型別,其指向的動態記憶體空間將無法得到釋放

9:q,r為內建型別指標,儲存動態記憶體的地址,進行二次賦值之後,r原來指向的記憶體空間將得不到釋放,造成記憶體洩漏

q2,r2為智慧指標,r2進行賦值之後,其計數器將減一,由於r2是指向該記憶體空間的唯一智慧指標,所以該記憶體會得到釋放

10:正確無誤

相關推薦

C++Primer 習題答案1~10

1:知識點1:物件生命週期:全域性物件在程式啟動時分配,在程式結束時銷燬。區域性自動物件,當我們進入其定義所在程式塊時被建立,在離開塊時被銷燬。區域性static物件在第一次使用前分配,在程式結束時銷

C++Primer 習題答案1~10

1:這個比較簡單,類比下 find() 函式也就知道了。 #include<iostream> #include<algorithm> #include<vector> using namespace std; void main() {

C++Primer 習題答案 動態記憶體Dynamic Memory

12.1 b1包含4個元素; b2被銷燬。 12.2 strblob.h #ifndef STRBLOB_H_ #define STRBLOB_H_ #include <string> #include <initializer_list&g

C++Primer 習題答案31~40

31:知識點1:容器的改變可能會使迭代器失效,插入和刪除各有其相關的規則,P315. 知識點2:必須保證每次改變容器的操作之後都正確的重新定位迭代器的操作 知識點3:呼叫erase()之後,其返回的迭代器指向的是序列中的下一個元素,其返回的迭代器可以用來更新 知識點4:

C++Primer 習題答案41~50

41:  #include<iostream> #include<string> #include<vector> using namespace std; void main() { vector<char> c{ 'a'

C++Primer 十三習題答案41~50

41:就是前置先加後用,後置先用後加,first_free指向的是一個空位置,前置的話會跳過一個空位置。 42:本章所實現的StrVec類屬於簡化版本的容器類,只適用於string,執行時可動態分配

C++Primer 十三習題答案31~40

31:這幾題都是舉例使用動態記憶體管理類,多是程式碼,多寫寫 #include<iostream> #include<string> #include<vector> #include<algorithm> using

C++Primer 第二習題答案11~20

2.11 涉及知識點: 宣告:使得名字為程式所知,如果想使用該變數,則必須實現包含其宣告。宣告會確定變數的名字和型別。 定義:創建於名字關聯的實體。定義會申請儲存空間,可能會賦予初始值。 如果想宣告一

C++Primer 習題答案31~40

1:這個的話沒什麼難度吧,記住下標從0開始就好了 #include <iostream> #include <string> #include <vector>

【練習題】--元組Think Python

元組 1.元組不可修改 元組是一系列的值。這些值可以是任意型別的,並且用整數序號作為索引,所以可以發現元組和列表非常相似。二者間重要的區別就是元組是不可修改的。 元組的語法是一系列用逗號分隔的值: >>> t = 'a', 'b', 'c', 'd', 'e'

強化學習RLAI讀書筆記資格跡Eligibility Traces

資格跡是強化學習演算法中的一個基本機制。比如很流行的其中的指的就是資格跡的使用。基本上所有的TD演算法都能夠和資格跡進行組合從而得到一個更通用的演算法。資格跡把TD和MC方法統一了起來。當TD演算法和資格跡進行組合使用時,得到了一組從一步TD延伸到MC演算法的演算法家族。一般中間部分的演算法效果比兩

概論論與數理統計嚴繼高習題答案含過程

com 概論 img 9.png ima mage bubuko 技術 image 第八題在下一頁 概論論與數理統計嚴繼高版第六章習題答案(含過程)

概率論與數理統計嚴繼高習題答案含過程

src mage 習題答案 .com 概率 技術分享 統計 http com 無7.3(不考)總習題我只有草稿,忘記帶了,想起來就更 概率論與數理統計嚴繼高版第七章習題答案(含過程)

概率論與數理統計嚴繼高1第二習題答案含過程

bubuko inf logs tps 統計 src 概率論 nbsp html 這是嚴繼高第一版的答案!!!!!!第二版博客也有目錄裏面找一下!!! 2.1-2.3和第二版的一樣,鏈接https://www.cnblogs.com/cs-learn/p/9498711.h

python 核心程式設計第二9習題答案自寫

test 9.1 fileload = 'C:/Users/Administrator/Desktop/test/test9.1.txt' f = open(fileload,'r') for eachline in f: for ps in ea

C Primer Plus(6)複習題答案

12.8複習題 哪些類別的變數可以成為它所在函式的區域性變數? 答:(我的答案)具有塊作用域的變數,還有函式頭中的形式引數。 (標準答案)自動儲存類別;暫存器儲存類別;靜態、無連結儲存類別 哪些類別的變數可以在它所在的程式的執行期一直存在? 答:(我的答案)具有靜態儲

c++ primer答案

15.01 什麼是虛成員? 虛成員是基類希望派生類進行覆蓋的函式,在其成員前加關鍵字virtual,使得該成員可以實現動態繫結。 15.02 protected訪問說明符與private有何區別? private成員:即使是基類的派生類也無法直接訪問。 protected成員:基類的

C++Primer 中文版 課後習題答案

//10.1 #include<iostream> #include<algorithm> #include<string> #include<vector> #include<list> using namesp

C++ primer 練習答案

第15章 面向物件程式設計 15.3 #include <iostream> #include <string> using namespace std; class Quote { public: Quote() =

c primer plus()編程練習-編程練習

兩個感嘆號 nal getchar putc 進制 類型 運算 pre 重做 1.編寫一個程序。該程序讀取輸入直到遇到#字符,然後報告讀取的空格數目、讀取的換行符數目以及讀取的所有其他字符數目。 #include<stdio.h> #include<ct