淺析C++中的動態(tài)內(nèi)存分配
程序在運(yùn)行過程對內(nèi)存進(jìn)行分配申請與釋放
new運(yùn)算符
運(yùn)行時(shí)存儲分配,返回可以存放對應(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ù)組容量的大小隨著函數(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)存,返回?cái)?shù)組中第一個(gè)元素的指針
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ù)組
如果形參是一個(gè)二維數(shù)組,必須指定第一維度的大小,a[][10] 合法,但是 a[][]非法,編譯時(shí)就確定數(shù)組的長度,但很多場景下需要每個(gè)長度不一的二維數(shù)組
因?yàn)槭褂胣ew對數(shù)組進(jìn)行動態(tài)分配,返回?cái)?shù)組中第一個(gè)元素的地址,所有創(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ù)組中的每一個(gè)元素指向的數(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ù)
- 只能操作指針類型對象
- 單個(gè)對象使用delete運(yùn)算符,但多個(gè)對象的數(shù)組則需要使用delete[]運(yùn)算符
#include <iostream>
int main() {
int* y = new int(10);
// 釋放指針指向的單個(gè)對象的內(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)存空間(存儲空間)不在需要時(shí)
到此這篇關(guān)于淺析C++中的動態(tài)內(nèi)存分配的文章就介紹到這了,更多相關(guān)C++動態(tài)內(nèi)存分配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)組名不等于指針?sizeof()函數(shù)求數(shù)組大小錯(cuò)誤問題及解決
這篇文章主要介紹了數(shù)組名不等于指針?sizeof()函數(shù)求數(shù)組大小錯(cuò)誤問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C語言實(shí)現(xiàn)找出二叉樹中某個(gè)值的所有路徑的方法
這篇文章主要介紹了C語言實(shí)現(xiàn)找出二叉樹中某個(gè)值的所有路徑的方法,針對數(shù)據(jù)結(jié)構(gòu)中二叉樹的實(shí)用操作技巧,需要的朋友可以參考下2014-09-09

