C/C++动态内存tcy
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos显示历史命令执行时间
- 下一篇: 讯飞语音 - 贾维斯