标签:
动态分配(Dynamic Memory)内存是指在程序运行时(runtime)根据用户输入的需要来分配相应的内存空间。
1.内存分配操作符new 和 new[]
Example:
(1)给单个元素动态分配内存
int * pointer = new int; //动态分配一个用于存放整型变量的内存空间,并将该存储空间的地址返回给pointer
(2)给多个元素(数组)动态分配内存空间
int * p = new int [10]; //动态分配可以存放10个整型变量的内存空间,并将该存储空间的首地址返回给 p
在这里,动态创建的数组 p 的长度可以是常量,也可以是变量(用户输入的长度);而一般的数组在创建时的长度必须是常量。
2.内存收回操作符delete 和 delete[]
与上面两种情况分别对应的内存收回操作符为:
delete pointer; //收回动态分配的单个元素的内存空间 delete [] p; //收回动态分配数组的内存空间
3.Demo
#include <iostream> using namespace std; int main() { char input[100]; int i, n; long * p; cout << "How many numbers do you want to type in ? "<<endl; cin.getline(input, 100); i = atoi(input); p = new long[i]; //根据输入的长度来动态创建内存空间 if (p == NULL) //检查所请求的内存是否成功分配 exit(1); for (n = 0; n < i; n++) { cout << "Please enter number: "; cin.getline(input, 100); p[n] = atol(input); } cout << "You have entered: "; for (n = 0; n < i; n++) { cout << p[n] << ", "; } cout << endl; delete[] p; //回收已分配的内存空间 system("pause"); return 0; }
result:
4.关于二位数组的内存动态分配问题
(1)二位数组的动态内存分配方式:
int **p = new int *[row]; //其中row指的是二位数组的行数 for(int i=0;i<row;i++) { p[i]=new int [col]; //col 是二维数组的列,p 是一个指向 int 类型的指针 }
(2)删除这个二位数组分配的内存空间的方式:
for(int i=0;i<row;i++) { delete[] p[i]; //先删除二维数组的列 } delete[] p; //再删除二维数组的行
(3)Demo
#include<iostream> using namespace std; int main() { double **data; int m, n; cout << "Please input the row:" << endl; cin >> m; cout << "Please input the column: " << endl; cin >> n; data = new double*[m]; //申请行的空间 if (data == NULL) //检查内存是否分配成功 { cout << "Could not allocate." << endl; exit(1); } for (int i = 0;i < m;i++) { data[i] = new double[n]; //申请列的空间 if (data[i] == NULL) { cout << "Could not allocate,Bye..." << endl; exit(1); } } //申请空间结束,接下来进行初始化操作 for (int i = 0;i < m;i++) //初始化数组 { for (int j = 0;j < n;j++) { data[i][j] = i*n + j; } } for (int i = 0;i < m;i++) //输出数组 { for (int j = 0;j < n;j++) { cout << data[i][j] << " "; } cout << endl; } for (int i = 0;i < m;i++) //释放动态分配的内存 delete[] data[i]; delete[] data; system("pause"); return 0; }
标签:
原文地址:http://www.cnblogs.com/runningRain/p/5930638.html