日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++动态内存tcy

發布時間:2024/1/18 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++动态内存tcy 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態內存管理 2020/3/15C++推薦用容器1.1.概念: 1) 棧stack:在函數內部聲明的所有變量都將占用棧內存。 2) 堆heap:這是程序中未使用的內存, 在程序運行時可用于動態分配內存。 3) 當對象在stack上時析構函數自動調用;在heap上時需調用delete后析構函數才會被執行 4) delete不能刪除stack上指針值;只能刪除heap上指針值(也就是new出來的對象) 1.2.頭文件:malloc.h(ANSI標準建議用stdlib.h,但很多編譯器可能不支持) 1.3.強制類型轉換:char *arr = malloc( 200 * sizeof(char) ); // C 語言正確char *arr = (char *)malloc( 200 * sizeof(char) ); // C++必須強制類型轉換1.4動態變長結構體:typedef StructType{ int id;char name[0];}sType;//占用4字節內存,name不占內存sType *s = NULL; s = malloc(sizeof(*s) + 100);//sizeof(*s)=4;4字節給id成員用,100字節屬于name成員s->id = 1010;strcpy(s->name,"hello"); //一結構體中只有一個可變長成員,且必是最后一個成員1.5.注意: 1)禁止訪問空指針;在對指針賦值前,要確保沒內存位置會變為孤立; 2)內存分配都應有分配/釋放配對;只釋放動態分配的內存;用free釋放malloc,realloc,calloc;不能釋放aligned_alloc內存分配函數分配的內存空間 3)釋放結構化元素由內向外 4)正確處理返回動態分配的內存引用的函數返回值, 在引用中釋放 5)內存釋放后必須為指針賦一個新值NULL;指針被釋放后, 指針變量本身并沒有被刪除; 2.函數:來實現對內存區域的堆上內存進行管理 1) void*calloc(size_t count,size_t size) //C分配連續內存區域,每字節初始化為0 2) void*malloc(size_t size) //C分配連續內存區域,值未知//返回值:返回分配內存區域首字節地址或NULL 3) void *realloc(void *address, size_t newsize); //C調整已分配的內存區域//參數1指向堆內動態分配內存;參數1重分配大小(=0時返回NULL并不代表指針被釋放) 4) void free(void *address); //C釋放已分配的內存區域 5) new int[2]/delete[] p3.實例: 實例1:#include <stdio.h>#include <stdlib.h>#include <malloc.h>int * p =NULL;p= (int *) malloc(sizeof(int) * 10);//從堆中動態分配40字節內存空間memset(p , 0 , sizeof(int)*10); //內存空間初始化for(int i = 0;i < 10;i++)a = *(p+i);free(p);p=NULL;int * p1= NULL;p1 = (int *)calloc(10, sizeof(int));//不需要memset進行初始化free(p1);p1=NULL; 實例2: 2.1) int * arr = new int[M]; //C++ 1D數組M分配內存delete[] arr; //C++ 1D釋放內存2.2) int ** arr = new int *[M]; //C++ 2D數組M*N分配內存for (int i = 0; i < M; i++)arr[i] = new int[N];for (int i = 0; i < M; i++) //C++ 2D釋放內存delete[] arrary[i];delete[] arr;2.3) int *** arr = new int **[M]; //C++ 3D數組M*N*H分配內存for (int i = 0; i < M; i++){arr[i] = new int *[N];for (int j = 0; j < N; j++)arr[i][j] = new int[H];}for (int i = 0; i < M; i++) //C++ 3D釋放內存{for (int j = 0; j < N; j++)delete[] arr[i][j];delete[] arr[i];}delete[] arr; ===========================================================================================實例3: 1)new類型檢查;自動計算類型大小;分配內存的同時創建對象 2)內存先分配外層,在分配內層,釋放則相反 3)返回值正確處理 int *_arr(void){return (int *)malloc(10 * sizeof(int));}int main() {int *arr = _arr();for (int i = 0; i < 10; i++)arr[0] = i;for (int i = 0; i < 10; i++)printf("%d; ", arr[0]);free(arr); } 實例4: int * pvalue = NULL; if (!(pvalue = new int)) {cout << "Error: out of memory." << endl;exit(1); } ============================================================================================== 實例5:2D數組 #include <iomanip>#define M 3 #define N 4 #define H 2 using namespace std;int main(){int i, j, r = 0;int **p = new int *[M];//分配內存for (i = 0; i < M; i++)p[i] = new int[N];for (i = 0; i < M; i++)//數組初始化{for (j = 0; j < N; j++, r++)p[i][j] = r;}for (i = 0; i < M; i++)//顯示{for (j = 0; j < N; j++)cout << setw(2) << p[i][j] << "; ";cout << endl;}for (i = 0; i < M; i++)//釋放內存delete[] p[i];delete[] p;return 0; } =============================================================================================== 實例6:3D數組 int main(){int i, j, k,r=0;int *** p = new int **[M];//分配內存for (i = 0; i < M; i++){p[i] = new int *[N];for (j = 0; j < N; j++)p[i][j] = new int[H];}for (i = 0; i < M; i++) //數組初始化{for (j = 0; j < N; j++){for (k = 0; k < H; k++,r++)p[i][j][k] = r;}}for (i = 0; i < M; i++) //顯示{for (j = 0; j < N; j++){for (k = 0; k < H; k++, r++)cout << setw(2) << p[i][j][k] << "; ";cout << endl;}cout << endl;}for (i = 0; i < M; i++) //釋放內存{for (j = 0; j < N; j++)delete[] p[i][j];}for (i = 0; i < H; i++){delete[] p[i];}delete[] p; } 4.備注: C++摒棄C中realloc()函數在C中realloc()可改變已分配內存區大小。他僅保證能工作于這樣的數組之上: 它們被malloc()(或類似函數)分配,包含一些沒有用戶定義的復制構造函數(copy constructors)的對象 而且要記住與通常的期望相反,realloc()有時也必須復制它的參數數組。在C++中處理內存重新分配更好方法是使用標準庫中容器如vector,并讓它自我增長。 C++里沒有realloc不是遺憾,而是精心選擇和淘汰的結果。 在C里realloc一般而言是重新分配一塊空間,然后把舊空間的內容copy到新空間里去。 而對象空間怎么copy?是copy字節還是用copy constructor?無論哪個都不合適。 那種想在原地(即首地址不動)就把申請內存空間擴大的思想不是一個好思想。如實在想做類似于realloc()函數操作參考:#include<iostream> using namespace std;int main() {int *oldbuf = new int[5];int *newbuf = new int[10];for (int i = 0; i < 5; i++) { oldbuf[i] = i; }std::copy(oldbuf, oldbuf + 5, newbuf);delete[] oldbuf;for (int i = 5; i < 10; i++){newbuf[i] = i;}cout << "[";for (int i = 0; i < 10; i++){cout << newbuf[i] <<",";}cout<<"]"<<endl;//[0,1,2,3,4,5,6,7,8,9,] }

?

?

?

?

?

總結

以上是生活随笔為你收集整理的C/C++动态内存tcy的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。