1.动态内存的创建
动态内存首先是通过new关键词或者malloc函数在堆区开辟出一块固定的内存大小(一般局部变量都是在栈区存放的)
2.动态内存与指针
使用new得到的指针与其他指针并没有什么不同,可以将new出来的指针赋值给普通指针,并且可以用函数返回一个new指针,并在函数之外去delete也可以。
程序如下
int* cal(int a, int b)
{
int* res = new int[4];
//res指针只在这个子程序中有效,是一个局部指针,当这个子程序结束,该指针变量也会被释放,但是指向的动
//态内存会跟着返回值返回给主程序中的指针,如果主程序没有接受返回值,就会导致内存溢出。
res[0] = a + b;
res[1] = a - b;
res[2] = a*b;
res[3] = a / b;
return res;
}
int main(void)
{
int *a;
a = cal(4, 2);
cout << a[0] << endl;
cout << a[1] << endl;
cout << a[2] << endl;
cout << a[3] << endl;
delete[] a;
system("pause");
return 0;
}
如果有多个指针指向同一片动态内存,只需要delete一个指针即可,如果delete第二个指向同一片内存地址的指针,那么程序就会崩溃(一直在无休止的运行)。
错误程序示例:
int* cal(int a, int b)
{
int* res = new int[4];
res[0] = a + b;
res[1] = a - b;
res[2] = a*b;
res[3] = a / b;
return res;
}
int main(void)
{
int *a;
int *b;
a = cal(4, 2);
b = a;
cout << a[0] << endl;
cout << a[1] << endl;
cout << a[2] << endl;
cout << a[3] << endl;
cout << a << endl;
delete[] a;
cout << a << endl;//内存空间删除,指针还存在,但是不再指向原地址了
cout << b[0] << endl;
cout << b[1] << endl;
cout << b[2] << endl;
cout << b[3] << endl;
cout << b;
delete[] b;//执行到此处就一直运行而没有结果,因为该内存地址已经删除了
system("pause");
return 0;
}
3.动态内存的释放
通过delete关键词或者free函数来释放栈区的动态内存,其实就是将指针指定的动态内存的控制权交还给CPU,允许CPU能够重新将这块动态内存给分配出去