今天写一个返回二维数组的函数碰到内存数据存储的问题,才发现没有真正理解c/c++内存。虽然书上的下面知识看了很多遍,以为就那么回事。但是实践碰到问题,才真正理解。
-----------------------------------------------------------------------------------------
C++三种管理内存方式:
1.自动存储
在函数内部定义的常规变量使用的自动储存空间,被称为自动变量(automatic variable)。
通常储存在栈中,随函数的产生而产生,函数的消亡而消亡。
2.静态存储
实在整个程序执行期间都存在的存储方式。使变量成为静态储存的方式有两种:
n 函数外面定义它
n 在声明变量是使用关键字static
3.动态储存
数据的生命周期不完全受程序或函数的生命周期控制,可以通过new和delete运算符来管理,也可以使用库函数malloc和free。在c++中被称为自由储存空间(free store)或堆(heap)。
-------------------------------------------------------------------------------------------
#include<iostream>
using namespace std;
/*在不同函数定义中分别使用不同的内存申请做测试*/
int * f();
int * f_malloc();
int *f_new();
int *f_static();
int ** f_2();
//空函数,测试用
void empty(){};
int main(){
int * t = f();//此时指针t指向的内存空间在栈中个,f_malloc,f_new,f_static,这三中方式都是动态储存,内存储存在自由堆中。不会导致下面的情况发生。
int x1 = t[0];//x1 =1
empty();//即使是空函数,也会调用栈,将上一个存储空间将被释放。如果只使用int n = 1;不会影响到*t指针的内存空间。
int x2 = t[0];//x2 = -858993460
int ** t = f_2();//这样也不能用,必须将函数中的a、b数组也设为static 或使用new将变量设为静态变量或动态变量才行。
return 0;
}
int * f(){
int a[3] = { 1, 2, 3 };
return a;
}
int * f_malloc(){
int *a = (int *)malloc(sizeof(int) * 3);
for (int i = 1; i < 4; i++)
{
a[i] = i+1;
}
return a;
}
int *f_new(){
int * p = new int[3]{1, 2, 3};
return p;
}
int *f_static(){
static int a[3] = { 1, 2, 3 };
return a;
}
int ** f_2(){
int a[] = { 1, 2, 3 };
int b[] = { 4, 5, 6 };
static int *c[2] = { a, b };
}