淺析C++中的動態(tài)內(nèi)存分配
程序在運行過程對內(nèi)存進行分配申請與釋放
new運算符
運行時存儲分配,返回可以存放對應類型數(shù)據(jù)的內(nèi)存地址,指向分配的內(nèi)存空間
1.分配基礎類型內(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ù)組進行動態(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)用對象關聯(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ù)組中元素對應的析構(gòu)函數(shù)
delete[] a;
}
使用場景:動態(tài)分配的內(nèi)存空間(存儲空間)不在需要時
到此這篇關于淺析C++中的動態(tài)內(nèi)存分配的文章就介紹到這了,更多相關C++動態(tài)內(nèi)存分配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++?Qt開發(fā)之使用QUdpSocket實現(xiàn)UDP網(wǎng)絡通信
Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,本文主要介紹如何運用QUdpSocket組件實現(xiàn)基于UDP的網(wǎng)絡通信功能,需要的可以參考下2024-03-03

