C++ | C++动态内存

C++ | C++动态内存

C++动态内存

  • :在函数内定义的变量,都将在栈中分配内存空间。
  • :这是程序未使用的内存空间,在程序运行过程中可以动态分配。

很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。

在 C++ 中,您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。
这种运算符即 new 运算符。

如果您不再需要动态分配的内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。

malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。
new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。

new 和 delete 运算符

new data-type; //new为任意类型的数据动态分配内存的语法

实例1:

double* pvalue  = NULL; /* 初始化为NULL的内存指针 */
if( !(pvalue  = new double )) /* 为变量申请内存 */
{
   cout << "Error: out of memory." <<endl; /* 内存申请失败 */
   exit(1);
}

delete pvalue; /* 释放pvalue所指向的内存空间 */

实例2:

/*******************************************************************
 *   > File Name: new.cpp
 *   > Create Time: 2021年09月13日 23:06:38
 ******************************************************************/
#include <iostream>
using namespace std;

int main(void)
{
    double *pvalue = NULL; /* 初始化为NULL的内存指针 */

    pvalue = new double; /* 为变量申请内存 */
    if(pvalue == NULL) /* 申请失败 */
    {
        cout << "new double err." << endl;
        exit(-1);
    }

    *pvalue = 199.99; /* 赋值 */
    cout << "value of *pvalue: " << *pvalue << endl;
    delete pvalue; /* 释放pvalue所指向的空间 */

    return 0;
}

编译、运行:

PS D:\2.SoftTools\cygwin64\home\fly\workSpace\cplusplus\day1> make
g++ -o new new.cpp -g -Wall
PS D:\2.SoftTools\cygwin64\home\fly\workSpace\cplusplus\day1> .\new.exe
value of *pvalue: 199.99

数组的动态内存分配

一维数组

// 动态分配,数组长度为 m
int *array=new int [m];
 
//释放内存
delete [] array; /* 删除array所指向的数组 */

二维数组

/*******************************************************************
 *   > File Name: two-dimensianal-arr.cpp
 *   > Create Time: 2021年09月15日 22:21:31
 ******************************************************************/
#include <iostream>
using namespace std;

int main(void)
{
    int **array; // 二维数据
    const int m = 3; // 第一维长度为m
    const int n = 2; // 第二位长度为n

    array = new int *[m];
    for(int i = 0; i< m; i++)
    {
        array[i] = new int [n];
    }

    for(int i = 0; i< m; i++)
    {
        delete [] array[i];
    }
    delete [] array;

    return 0;
}

实例3:

/*******************************************************************
 *   > File Name: two-dimensianal-arr2.cpp
 *   > Create Time: 2021年09月15日 22:38:27
 ******************************************************************/
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    int **p;
    int i,j; // p[4][8]

    p = new int *[4]; // 4组int型指针
    for(i = 0; i< 4; i++)
    {
        p[i] = new int [8];
    } 

    /* 赋值 */
    for(i = 0; i< 4; i++)
    {
        for(j = 0; j< 8; j++)
        {
            p[i][j] = i*j;
        }
    }  

    /* 输出 */
    for(i = 0; i< 4; i++)
    {
        for(j = 0; j< 8; j++)
        {
            if(0 == j)
            {
                cout << endl;
            }

            cout << p[i][j] << '\t';
        }
    } 
    cout << endl;

    /* 开始释放申请的堆 */
    for(i = 0; i< 4; i++)
    {
        delete [] p[i];
    }
    delete [] p;

    return 0;
}

编译、运行:

PS D:\2.SoftTools\cygwin64\home\fly\workSpace\cplusplus\day2> make
g++ -o two-dimensianal-arr2 two-dimensianal-arr2.cpp -g -Wall
PS D:\2.SoftTools\cygwin64\home\fly\workSpace\cplusplus\day2> .\two-dimensianal-arr2.exe

0       0       0       0       0       0       0       0
0       1       2       3       4       5       6       7
0       2       4       6       8       10      12      14
0       3       6       9       12      15      18      21

三维数组

实例4:

/*******************************************************************
 *   > File Name: three-dimensional-arr.cpp
 *   > Create Time: 2021年09月15日 23:04:10
 ******************************************************************/
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    int i,j,k; // [2][3][4]

    int ***p;
    p = new int **[2];
    for(i=0; i< 2; i++)
    {
        p[i] = new int *[3];
        for(j=0; j< 3; j++)
        {
            p[i][j] = new int [4];
        }
    }

    for(i=0; i< 2; i++)
    {
        for(j=0; j< 3; j++)
        {
            for(k=0; k< 4; k++)
            {
                p[i][j][k] = i*j*k;
                cout << p[i][j][k] << " ";
            }
            cout << endl;
        }
        cout << endl;
    }

    for(i=0; i< 2; i++)
    {
        for(j=0; j< 3; j++)
        {
            delete [] p[i][j];
        }
    }
    for(i=0; i< 2; i++)
    {
        delete [] p[i];
    }
    delete [] p;

    return 0;
}

编译、运行:

PS D:\2.SoftTools\cygwin64\home\fly\workSpace\cplusplus\day2> make
g++ -o three-dimensional-arr three-dimensional-arr.cpp -g -Wall
PS D:\2.SoftTools\cygwin64\home\fly\workSpace\cplusplus\day2> .\three-dimensional-arr.exe
0 0 0 0
0 0 0 0
0 0 0 0

0 0 0 0
0 1 2 3
0 2 4 6

对象的动态内存分配

实例5:

/*******************************************************************
 *   > File Name: newObj.cpp
 *   > Create Time: 2021年09月15日 23:20:49
 ******************************************************************/
#include <iostream>
using namespace std;

class Box{
public:
    Box()
    {
        cout << "Calling constructor." << endl;
    }  
    ~Box()
    {
        cout << "Calling destructor." << endl;
    }  
};

int main(int argc, char* argv[])
{
    Box *pbox = new Box[4];
    delete [] pbox;

    return 0;
}

编译、运行:

PS D:\2.SoftTools\cygwin64\home\fly\workSpace\cplusplus\day2> make
g++ -o newObj newObj.cpp -g -Wall
PS D:\2.SoftTools\cygwin64\home\fly\workSpace\cplusplus\day2> .\newObj.exe
Calling constructor.
Calling constructor.
Calling constructor.
Calling constructor.
Calling destructor.
Calling destructor.
Calling destructor.
Calling destructor.

# 如果要为一个包含四个 Box 对象的数组分配内存,构造函数将被调用 4 次,
# 同样地,当删除这些对象时,析构函数也将被调用相同的次数(4次)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值