C++面试常见问题——02动态分配内存
生活随笔
收集整理的這篇文章主要介紹了
C++面试常见问题——02动态分配内存
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
動態(tài)分配內(nèi)存
C++動態(tài)內(nèi)存
C++程序中內(nèi)存分為兩個部分
- 堆:程序中未使用的內(nèi)存,在程序運行時可用于動態(tài)分配內(nèi)存。
- 棧:函數(shù)內(nèi)部申明的所有變量都將占用棧內(nèi)存。
很多時候不知道一個程序到底需要多少內(nèi)存,可以在程序運行時使用關(guān)鍵字new動態(tài)分配內(nèi)存,這會返回所分配的空間地址。當不在需要分配的內(nèi)存時可以使用delete進行刪除。
動態(tài)內(nèi)存分配方式
1. new與delete
用法:
類型名 *指針變量 = new 類型名;
類型名 *指針變量 = new 類型名[元素個數(shù)];
int *p = new int; //指向int型的指針
int *pArr = new int[len]
使用new時自由存儲區(qū)可能已經(jīng)被用完,因此最好檢查是否分配成功。
int *p = NULL;
if( !(p = new int) ){
cout<<"ERROR"<<endl;
exit(1);
}
delete的用法
delete p;
delete []pArr; //刪除內(nèi)存塊后強烈建議將指針指向NULL,避免其成為野指針。
pArr = NULL;
二維數(shù)組的動態(tài)內(nèi)存分配
int **array;
//假設(shè)維度為m x n
array = new int *[m];
for(int i = 0; i < m;i++){
array[i] = new int array[n];
}
//刪除
for(int i = 0;i < m;i++){
delete []array[i];
}
delete []array;
2.對象的二動態(tài)內(nèi)存分配
#include<iostream>
using namespace std;
class Box{
public:
Box(){
cout<<"構(gòu)"<<endl;
}
~Box(){
cout<<"析"<<endl;
} };
int main(){
Box* b = new Box[5]; //構(gòu)構(gòu)構(gòu)構(gòu)構(gòu)
delete []b; //析析析析析
return 0;
}
2. malloc與free
malloc是編譯器的內(nèi)置函數(shù),包含于頭文件stdlib.h。
//malloc原型
void malloc(unsigned in size)
//free原型
void free(void* p)
//malloc用法
int *p = (int*)malloc(sizeof(int)*len);
for(int i= 0;i < len;i++){
cin>>*p;
}
//free用法
free(p);
- 使用new關(guān)鍵字時不僅開辟了內(nèi)存,還創(chuàng)建了對象,特別是對類使用時自動調(diào)用構(gòu)造函數(shù),delete時自動調(diào)用析構(gòu)函數(shù)。而malloc對類使用時只會開辟內(nèi)存空間,不會對類自動進行初始化,free時也不會清理成員函數(shù)的
- malloc&free是標準庫函數(shù),new&delete是C++關(guān)鍵字。
- malloc&free需要手動計算大小,返回值為void*。new&delete自動計算類型的大小,返回對應(yīng)類型的指針。
- malloc&free分配內(nèi)存失敗會返回0。new&delete分配失敗時會拋出異常。
參考鏈接:
- 菜鳥教程——C++動態(tài)內(nèi)存
- malloc/free和new/delete的區(qū)別和聯(lián)系
總結(jié)
以上是生活随笔為你收集整理的C++面试常见问题——02动态分配内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Axure下载,附注册码
- 下一篇: MVC将Base64 保存为图片