淺析C++中的動(dòng)態(tài)內(nèi)存分配
程序在運(yùn)行過(guò)程對(duì)內(nèi)存進(jìn)行分配申請(qǐng)與釋放
new運(yùn)算符
運(yùn)行時(shí)存儲(chǔ)分配,返回可以存放對(duì)應(yīng)類(lèi)型數(shù)據(jù)的內(nèi)存地址,指向分配的內(nèi)存空間
1.分配基礎(chǔ)類(lèi)型內(nèi)存存儲(chǔ)空間
#include <iostream> using namespace std; int main() { string *name; // 動(dòng)態(tài)在堆空間分配存儲(chǔ)空間,字符串值 北門(mén)吹雪 值存儲(chǔ)到分配的內(nèi)存空間 name = new string("北門(mén)吹雪"); cout << *name << endl; delete name; }
2.動(dòng)態(tài)分配一維數(shù)組空間
很多函數(shù)使用一維或二維數(shù)組,這些數(shù)組是在編譯時(shí)大小未知的,數(shù)組容量的大小隨著函數(shù)調(diào)用動(dòng)態(tài)變大或者變小
#include <iostream> using namespace std; void alloc_one_dimensional(int len) { int *nums; // 內(nèi)存分配可能會(huì)失敗,通過(guò)try捕獲程序中的異常 try { // new對(duì)數(shù)組分配內(nèi)存,返回?cái)?shù)組中第一個(gè)元素的指針 nums = new int[len]; } catch (bad_alloc& e) { cout << "內(nèi)存分配失敗" << endl; } cout << "動(dòng)態(tài)分配內(nèi)存大小:" << len << endl; // 是否動(dòng)態(tài)分配的內(nèi)存 delete[] nums; } int main() { alloc_one_dimensional(10); alloc_one_dimensional(12); alloc_one_dimensional(13); }
3.動(dòng)態(tài)分配二維數(shù)組
如果形參是一個(gè)二維數(shù)組,必須指定第一維度的大小,a[][10]
合法,但是 a[][]
非法,編譯時(shí)就確定數(shù)組的長(zhǎng)度,但很多場(chǎng)景下需要每個(gè)長(zhǎng)度不一的二維數(shù)組
因?yàn)槭褂胣ew對(duì)數(shù)組進(jìn)行動(dòng)態(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) { // 先動(dòng)態(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操作符動(dòng)態(tài)分配的內(nèi)存空間,調(diào)用對(duì)象關(guān)聯(lián)類(lèi)型的析構(gòu)函數(shù)
- 只能操作指針類(lèi)型對(duì)象
- 單個(gè)對(duì)象使用delete運(yùn)算符,但多個(gè)對(duì)象的數(shù)組則需要使用delete[]運(yùn)算符
#include <iostream> int main() { int* y = new int(10); // 釋放指針指向的單個(gè)對(duì)象的內(nèi)存,調(diào)用對(duì)象的析構(gòu)函數(shù) delete y; int *a = new int[10]{1, 2, 3, 4}; // 釋放指針指向的數(shù)組對(duì)象所有內(nèi)存,遍歷依次調(diào)用數(shù)組中元素對(duì)應(yīng)的析構(gòu)函數(shù) delete[] a; }
使用場(chǎng)景:動(dòng)態(tài)分配的內(nèi)存空間(存儲(chǔ)空間)不在需要時(shí)
到此這篇關(guān)于淺析C++中的動(dòng)態(tài)內(nèi)存分配的文章就介紹到這了,更多相關(guān)C++動(dòng)態(tài)內(nèi)存分配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- c++ 動(dòng)態(tài)內(nèi)存分配相關(guān)總結(jié)
- C++使用動(dòng)態(tài)內(nèi)存分配的原因解說(shuō)
- 帶你了解C++的動(dòng)態(tài)內(nèi)存分配
- C語(yǔ)言編程C++動(dòng)態(tài)內(nèi)存分配示例講解
- c/c++內(nèi)存分配大小實(shí)例講解
- C++ 操作系統(tǒng)內(nèi)存分配算法的實(shí)現(xiàn)詳解
- C++繼承和動(dòng)態(tài)內(nèi)存分配
- 詳解C++的靜態(tài)內(nèi)存分配與動(dòng)態(tài)內(nèi)存分配
- C/C++的堆棧內(nèi)存分配的實(shí)現(xiàn)
相關(guān)文章
C++小知識(shí):C/C++中不要按值傳遞數(shù)組
今天小編就為大家分享一篇關(guān)于C++小知識(shí):C/C++中不要按值傳遞數(shù)組,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01如何用C寫(xiě)一個(gè)web服務(wù)器之I/O多路復(fù)用
本文主要介紹了如何用C寫(xiě)一個(gè)web服務(wù)器之I/O多路復(fù)用,本次選擇了 I/O 模型的優(yōu)化,因?yàn)樗欠?wù)器的基礎(chǔ),這個(gè)先完成的話,后面的優(yōu)化就可以選擇各個(gè)模塊來(lái)進(jìn)行,不必進(jìn)行全局化的改動(dòng)了。2021-05-05C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象的區(qū)別解析
在C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象是有區(qū)別的,不知你是否清楚的了解它們到底有什么樣的區(qū)別呢?下面小編就用示例來(lái)告訴大家吧,需要的朋友可以過(guò)來(lái)參考下2013-07-07C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)
這篇文章主要介紹了C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C語(yǔ)言實(shí)現(xiàn)的統(tǒng)計(jì)php代碼行數(shù)功能源碼(支持文件夾、多目錄)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的統(tǒng)計(jì)php代碼行數(shù)功能源碼,支持文件夾、多級(jí)目錄的統(tǒng)計(jì),在一些環(huán)境中會(huì)用到這個(gè)功能,需要的朋友可以參考下2014-08-08

C語(yǔ)言超市管理系統(tǒng)設(shè)計(jì)