在C++中是使用new 和 delete 來進行動態內存分配的,儘量減少(或不用)下面C中動態內存分配在C++中的使用。
/*
*動態內存分配的問題
* 在C語言中用的是:
*****(注意:malloc、calloc、realloc返回的值void* 類型,因此在使用時,要有顯示的類型轉換)
* void* malloc(size_t size)
* 在堆內存中分配一塊內存空間,存儲空間大小size = sizeof(ElemType)*分配的元素個數,
*返回那塊空間的起始地址。但是值不確定,因此用函數 memset(地址,值(0),字節數),將所分配
*的地址全部清零。
* void* calloc(size_t num,size_t size)
* 在內存中分配一個數組,並將數組中的值初始化爲 0;
* void* realloc(void* ptr,size_t size)
* 釋放舊地址空間,申請新地址空間,並且根據實際情況將舊空間的數據複製到新空間中,但是,
*如果還有多餘的空間,則這些新增的空間不保證清零。
*
* !!!在使用上述函數動態分配內存的時候,要注意判斷所分配的內存是否爲NULL或是不足!
*
* 既然在堆區中動態申請了內存,那麼就得對應的要回收,用函數 void free(void* ptr),
*其地址爲malloc、calloc、realloc的返回地址(保存在對應的指針變量中)
*
* 在C++中用的是:
* new 和 delete
*/
#include <iostream>
using namespace std;
#include <cstdlib>
int main()
{
// error: invalid conversion from ‘void*’ to ‘double*’ [-fpermissive]
//因此,在使用時必須要顯示的進行類型轉換
//double* pm = malloc(sizeof(double));
double* pm = (double*)malloc(sizeof(double));
//if(pm == NULL) exit(-1);
cout << "pm = " << pm << endl;
free(pm);
int* pc = (int*)calloc(7,sizeof(int));
cout << "pc = " << pc << endl;
int i;
for(i = 0; i != 7; i++)
cin >> pc[i]; //如果用*pc++的話,那麼pc的值會改變,那麼在後面用pc值的話,就會出錯
/*for(i = 0; i != 7; i++)
cout << *pc++ << ' ';*/
for(int* p = pc; p != pc+7; p++)
cout << *p << ' ';
cout << endl;
/*這這是將pc 所指向在堆區中動態分配的存儲空間給釋放掉了,
但是pc還是指向這塊空間,除非將pc 設置爲NULL*/
//free(pc); pc = NULL;
//cout << pc << endl;
pc = (int*)realloc(pc , sizeof(int)*10);
cout << "pc = " << pc << endl;
//cout << *pc << endl;
for(i = 0; i != 10; i++)
cout << *(pc+i) << ' ';
cout << endl;
free(pc);
return 0;
}