淺析C++中的動態(tài)內(nèi)存分配
程序在運行過程對內(nèi)存進(jìn)行分配申請與釋放
new運算符
運行時存儲分配,返回可以存放對應(yīng)類型數(shù)據(jù)的內(nèi)存地址,指向分配的內(nèi)存空間
1.分配基礎(chǔ)類型內(nèi)存存儲空間
#include <iostream> using namespace std; int main() { string *name; // 動態(tài)在堆空間分配存儲空間,字符串值 北門吹雪 值存儲到分配的內(nèi)存空間 name = new string("北門吹雪"); cout << *name << endl; delete name; }
2.動態(tài)分配一維數(shù)組空間
很多函數(shù)使用一維或二維數(shù)組,這些數(shù)組是在編譯時大小未知的,數(shù)組容量的大小隨著函數(shù)調(diào)用動態(tài)變大或者變小
#include <iostream> using namespace std; void alloc_one_dimensional(int len) { int *nums; // 內(nèi)存分配可能會失敗,通過try捕獲程序中的異常 try { // new對數(shù)組分配內(nèi)存,返回數(shù)組中第一個元素的指針 nums = new int[len]; } catch (bad_alloc& e) { cout << "內(nèi)存分配失敗" << endl; } cout << "動態(tài)分配內(nèi)存大小:" << len << endl; // 是否動態(tài)分配的內(nèi)存 delete[] nums; } int main() { alloc_one_dimensional(10); alloc_one_dimensional(12); alloc_one_dimensional(13); }
3.動態(tài)分配二維數(shù)組
如果形參是一個二維數(shù)組,必須指定第一維度的大小,a[][10]
合法,但是 a[][]
非法,編譯時就確定數(shù)組的長度,但很多場景下需要每個長度不一的二維數(shù)組
因為使用new對數(shù)組進(jìn)行動態(tài)分配,返回數(shù)組中第一個元素的地址,所有創(chuàng)建二維數(shù)組則第二維度只保留指針
#include <iostream> using namespace std; template<class T> void alloc_two_dimensional(T _, int number_of_rows, int number_of_columns) { // 先動態(tài)創(chuàng)建保存數(shù)組元素的指針 int **matrix = new T *[number_of_rows]; // 然后再依次創(chuàng)建一維數(shù)組 for (int row = 0; row < number_of_rows; row++) { matrix[row] = new T[number_of_columns]; } // 修改二維數(shù)組的值 matrix[1][1] = 10; matrix[2][2] = 10; matrix[3][3] = 10; matrix[4][4] = 10; // 遍歷二維數(shù)組 for (int i = 0; i < number_of_rows; i++) { for (int j = 0; j < number_of_columns; j++) { cout << matrix[i][j] << "\t"; } cout << endl; } // 釋放內(nèi)存 // 首先釋放保存在數(shù)組中的每一個元素指向的數(shù)組 for (int i=0; i < number_of_rows; i++) { delete[] matrix[i]; } // 釋放最外層的數(shù)組 delete[] matrix; } int main() { int a; alloc_two_dimensional(a, 9, 12); }
delete 操作符
釋放由new操作符動態(tài)分配的內(nèi)存空間,調(diào)用對象關(guān)聯(lián)類型的析構(gòu)函數(shù)
- 只能操作指針類型對象
- 單個對象使用delete運算符,但多個對象的數(shù)組則需要使用delete[]運算符
#include <iostream> int main() { int* y = new int(10); // 釋放指針指向的單個對象的內(nèi)存,調(diào)用對象的析構(gòu)函數(shù) delete y; int *a = new int[10]{1, 2, 3, 4}; // 釋放指針指向的數(shù)組對象所有內(nèi)存,遍歷依次調(diào)用數(shù)組中元素對應(yīng)的析構(gòu)函數(shù) delete[] a; }
使用場景:動態(tài)分配的內(nèi)存空間(存儲空間)不在需要時
到此這篇關(guān)于淺析C++中的動態(tài)內(nèi)存分配的文章就介紹到這了,更多相關(guān)C++動態(tài)內(nèi)存分配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++用new創(chuàng)建對象和不用new創(chuàng)建對象的區(qū)別解析
在C++用new創(chuàng)建對象和不用new創(chuàng)建對象是有區(qū)別的,不知你是否清楚的了解它們到底有什么樣的區(qū)別呢?下面小編就用示例來告訴大家吧,需要的朋友可以過來參考下2013-07-07C++如何計算二進(jìn)制數(shù)中1的個數(shù)
這篇文章主要介紹了C++如何計算二進(jìn)制數(shù)中1的個數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼(支持文件夾、多目錄)
這篇文章主要介紹了C語言實現(xiàn)的統(tǒng)計php代碼行數(shù)功能源碼,支持文件夾、多級目錄的統(tǒng)計,在一些環(huán)境中會用到這個功能,需要的朋友可以參考下2014-08-08