C++内存管理方式

今天写一个返回二维数组的函数碰到内存数据存储的问题,才发现没有真正理解c/c++内存。虽然书上的下面知识看了很多遍,以为就那么回事。但是实践碰到问题,才真正理解。

-----------------------------------------------------------------------------------------

C++三种管理内存方式:

1.自动存储

在函数内部定义的常规变量使用的自动储存空间,被称为自动变量(automatic variable)。

通常储存在栈中,随函数的产生而产生,函数的消亡而消亡。

2.静态存储

实在整个程序执行期间都存在的存储方式。使变量成为静态储存的方式有两种:

n  函数外面定义它

n 在声明变量是使用关键字static

3.动态储存

数据的生命周期不完全受程序或函数的生命周期控制,可以通过newdelete运算符来管理,也可以使用库函数mallocfree。在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_mallocf_newf_static,这三中方式都是动态储存,内存储存在自由堆中。不会导致下面的情况发生。

    int x1 = t[0];//x1 =1

    empty();//即使是空函数,也会调用栈,将上一个存储空间将被释放。如果只使用int n = 1;不会影响到*t指针的内存空间。

    int x2 = t[0];//x2 = -858993460

    int  ** t = f_2();//这样也不能用,必须将函数中的ab数组也设为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 };

}

 

原文地址:https://www.cnblogs.com/dingblog/p/4464970.html