C++內(nèi)存管理不同方式分析
C++編程語言是一個應(yīng)用廣泛,功能強大的C語言升級版本。其中有很多內(nèi)容都需要我們不斷的去摸索。在這里我們先來了解一下有關(guān)C++內(nèi)存管理的相關(guān)知識,讓大家對C++對內(nèi)存操作的相關(guān)知識能有一個充分的了解。#t#
1. 使用new動態(tài)分配內(nèi)存:若沒有足夠內(nèi)存,則new返回0(空值指針null pointer);
2. 不要使用delete釋放不是new分配的內(nèi)存,delete釋放指針指向的內(nèi)存,但不會刪除指針本身;
3、對空值指針應(yīng)用delete是安全的;
4、創(chuàng)建數(shù)組時的靜態(tài)聯(lián)編與動態(tài)聯(lián)編:數(shù)組聲名int a[10], 靜態(tài)聯(lián)編,數(shù)組的長度在編譯時確定;
用new[]創(chuàng)建數(shù)組,動態(tài)聯(lián)編,運行時為數(shù)組分配內(nèi)存空間。動態(tài)-運行時分配內(nèi)存。
C++內(nèi)存管理總共有三種方式:自動存儲、靜態(tài)存儲、動態(tài)存儲(自由存儲空間或堆)(三塊獨立的內(nèi)存)
自動存儲:(auto / register ) 自動變量的持久性為自動的,在程序開始執(zhí)行其所屬的函數(shù)或代碼塊時創(chuàng)建,執(zhí)行 完后釋放。
- auto: in stack LIFO
- register: in CPU register
使用寄存器處理變量,提高訪問速度;沒有內(nèi)存地址,不能用&取地址。
靜態(tài)存儲:(global / static ) 在程序整個運行期間都存在. (外部鏈接性、內(nèi)部鏈接性、無鏈接性)初始化為0。
- int global = 1000; //外部鏈接性,可在程序的其他文件使用,
使用時要用extern聲名 (外部變量/全局變量)- static int one_file = 50;
//內(nèi)部鏈接性,只能在本文件使用 (函數(shù)如果為static也一樣,只能在該文件中被調(diào))- int main(){ ... }
- void func(){
- static int count = 0; //靜態(tài)局部變量,只在該代碼中可用,
但它在該代碼不活動時始終存在。- }
可用extern重新聲名以前定義過的外部變量;
訪問被隱藏的外部變量(被局部變量隱藏了):用作用域解析符(::)::n 表示使用n的全局版本
- const char * const months[12] = {"Jan", "Feb", "Mar",...};
第一個const防止字符串被修改,第二個const確保數(shù)組中每個指針始終指向它最初指向的字符串。
mutable限定符:const/volatile/mutable const禁止修改結(jié)構(gòu)成員,但是mutable使const結(jié)構(gòu)中的成員不受這種限制
- struct data { char name[30]; mutable int accesses; };
- const data a = {....}; strcpy(a.name, "fdsf");
//not allowed a.access++//allowed
外部定義的const數(shù)據(jù)的鏈接性為內(nèi)部的,跟static一樣
動態(tài)存儲:(free store / heap) new/delete, malloc/free
1、使用new來設(shè)置指針的語句必須位于函數(shù)中,因為只能使用常量表達式來初始化靜態(tài)存儲變量:
- float * p;
- //float *p = new float[20];
//initialization with non-const not allowed here- main (){ p = new float[20]; }
2、布局new操作符 (placement new): 自己指定空間為placement new提供內(nèi)存空間,而不是在heap中分配
- #include< new>
- char buffer[512];
- ......double *pd1, *pd2;
- pd1 = new double[N];
- pd2 = new (buffer) double[N];
以上就是我們對C++內(nèi)存管理的相關(guān)介紹。