c primer 基於過程的設計 5

2021-06-05 23:49:58 字數 2126 閱讀 9511

1.在區域性域中的變數宣告引入了區域性物件(local object)。有三種區域性物件:自動物件(automatic object)、暫存器物件(register object)以及區域性靜態物件(local static object)。區分這些物件的是物件所在儲存區的屬性和生命期。

2.自動物件的儲存分配發生在定義它的函式被呼叫時。分配給自動變數的儲存區來自於程式的執行棧,它是函式活動記錄的一部分。自動物件也被稱為具有自動儲存持續時間(automatic storage duration),或自動範圍(automatic extent)。未初始化的自動物件包含乙個隨機的位模式,是該儲存區上次被使用的結果。它的值是未指定的(unspecified)。在函式結束時,它的活動記錄被從執行棧中彈出。與該自動物件相關聯的儲存區被真正釋放。物件的生命期在函式結束時結束,它包含的任何值都被拋棄。

3.當乙個自動變數的位址被儲存在乙個生命期長於它的指標時,該指標被稱為空懸指標(dangling pointer)。

4.在函式中頻繁被使用的自動變數可以用register宣告。如果可能的話,編譯器會把該物件裝載到機器的暫存器中。如果不能夠的話,則物件仍位於記憶體中。

5.關鍵字register對編譯器來說只是乙個建議。有些編譯器可能忽略該建議,而是使用暫存器分配演算法找出最合適的候選放到機器可用的暫存器中。因為編譯器知道執行該程式的機器的結構,所以它選擇的暫存器的內容時常常會做出更有意義的決定。

6.靜態區域性物件具有靜態儲存持續期間(static storage duration),或靜態範圍(static extent)。它的值在函式呼叫間保持有效,但其名字的可視性仍限制在其區域性域內。靜態區域性物件在程式執行到該物件的宣告處時被首次初始化。未經初始化的靜態區域性物件會被程式自動初始化為0.

7.第三種物件允許程式設計師完全控制它的分配與釋放。這樣的物件被稱為動態分配的物件(dynamically allocated object)。動態分配的物件被分配在程式的空閒儲存區(free store)的可用記憶體池中。程式設計師用new表示式建立動態分配的物件,用delete表示式結束此類物件的生命期。

8.new表示式是由關鍵字new及其後面的型別指示符構成的,該型別指示符可以是內建型別或class型別。new表示式沒有返回實際分配的物件,而是返回指向該物件的指標。對該物件的全部操作都要通過這個指標間接完成。空閒儲存區分如果new表示式呼叫new()操作符不能得到要求的記憶體,通常會丟擲乙個bad_alloc異常。

9.但指標pi所指物件的記憶體被釋放時,它的生命期也隨之結束。如果指標運算元被設定為0,則c++會保證delete表示式不會呼叫操作符delete()。delete表示式只能應用在指向的記憶體是用new表示式從空閒儲存區分配的指標上。

10.與動態記憶體分配有關的程式錯誤:a)應用delete表示式失敗,是記憶體無法返回空閒儲存區。這杯稱作為記憶體洩露(memory leak)。b)對同一記憶體區應用了兩次delete表示式。c)在物件被釋放後讀寫該物件。

11.auto_ptr物件是c++標準庫提供的類模板,它可以幫助程式設計師自動管理用new表示式動態分配的單個物件。#include 有下述三種定義形式:

auto_ptridentifier(ptr_allocated_by_new);

auto_ptridentifier(auto_ptr_of_same_type);

auto_ptridentifier;//type_pointed_to代表由new表示式建立的物件型別

auto_ptrpi(new int(1024));//pi被初始化為由new表示式建立的物件的位址,且該物件的初始化值為1024

//new表示式建立的物件由pi指向,當pi的生命期結束時,它將被自動釋放

auto_ptrpstr_auto(new string("abcdef"));

auto_ptrpstr_auto2(pstr_auto);

當定義pstr_auto時,它知道自己對初始化字串擁有所有權,並且有責任刪除該字串。當乙個auto_ptr物件被用另乙個auto_ptr物件初始化或賦值時,左邊被賦值或初始化的物件就擁有了空閒儲存區底層物件的所有權,而右邊的auto物件則撤銷所有責任。

auto_ptrp_auto_int;

if(p_auto_int.get()!=0){}

p_auto_int.reset(new int(1024); //release()不僅像get()一樣返回底層物件的位址,而且還會釋放這物件的所有權。

基於RHEL5的安裝光碟的精簡過程筆記

基於rhel5的安裝光碟的精簡過程筆記 2008 01 24 23 12 在網上找了很久沒有找到基於rhel5 版本的光碟定製具體例項,只有自己花力氣去研究了一下anaconda 下面是整個操作過程的記錄 一 軟體包的確定 確定安裝光碟中軟體的依賴關係比較複雜,本文使用了一種很笨的方法,用標準的rh...

MySQLi基於面向過程的程式設計

mysqli在windows上,對於php 5.3或更新版本,mysqli擴充套件預設開啟,對於php 5.0 5.1 5.2,mysqli擴充套件預設並不會開啟,因此php.ini中php mysqli.dll這個dll 必須開啟。mysqli基於面向過程的程式設計和物件導向的程式設計是相對的,其...

MySQLi基於面向過程的程式設計

mysqli在windows上,對於php 5.3或更新版本,mysqli擴充套件預設開啟,對於php 5.0 5.1 5.2,mysqli擴充套件預設並不會開啟,因此php.ini中php mysqli.dll這個dll 必須開啟。mysqli基於面向過程的程式設計和物件導向的程式設計是相對的,其...