猿创征文 |【C++】动态内存的分配与回收

一、回顾C中动态分配内存和回收的方式

C中动态分配内存的方式
1.malloc
2. calloc
3. realloc
回收方式
free

代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *p1=(int *)malloc(sizeof(int));
    printf("%d\n",*p1);//没有初始化
    int *p2=(int *)calloc(1,sizeof (int));
    printf("%d\n",*p2);//有初始化
    int *p3=(int *)realloc(p2,sizeof(int)*10);
    printf("%d\n",*p3);//有初始化
    free(p1);
    //free(p2);
    //同一块堆区空间被多次释放会造成doublefree的现象,程序就会异常中止。
    free(p3);
    return 0;
}

结果展示:
在这里插入图片描述
总结:

  1. malloc在堆上开辟空间并没有进行初始化。
  2. calloc在堆上开辟空间是有初始化。
  3. relloc在堆上开辟空间都是有初始化。
  4. 同一块堆区空间被多次释放会造成double free的现象,程序就会异常中止。

二、C++中动态分配内存和回收的方式

C++提供了新的关键字new来动态分配空间。
同时为了回收空间,又提供关键字delete来释放空间。
在C++中支持malloc/free,但是我们一般都使用 new/delete

2.1 分配

2.1.1 单个空间的分配

格式: 数据类型 *指针名 = new 数据类型;
如: int *p = new int;
在堆区分配 1 个 int 大小的空间。

2.1.2连续空间的分配

格式: 数据类型 *指针名 = new 数据类型[个数];
如: int *p = new int[5];
在堆区分配 5 个 int 大小的空间,连续的。

2.2 回收

2.2.1 单个空间的回收

delete 指针名;

2.2.2 连续的空间的回收

delete []指针名;
[]里面不用写长度,但是[]必须写,表示释放指针指向的连续空间。

2.3 举例说明

2.3.1 单个空间的举例

代码如下:

#include <iostream>
using namespace std;

int main()
{
    int *pa=new int;
    *pa=100;
    cout << *pa << endl;
	不初始化
    int *pb=new int;
    cout << *pb << endl;
	//用0初始化
    int *pc = new int();
    cout<< *pc <<endl;
    delete pc;

    int *pd=new int(521);
    cout << *pd << endl;

    delete pa;
    delete pb;
    delete pc;
    delete pd;
    return 0;
}

结果展示:
在这里插入图片描述

总结:

  1. new分配的空间如果没有初始化,是随机值。
  2. 当在类型后加上()时,new分配的空间如果没有初始化,会自动用 0 进行初始化。
  3. 我们使用new时,一般都是直接初始化的操作,可以使用括号的方式直接初始化,new后面的内置类型后加个括号表示编译器在括号取值初始化内置类型所开辟的内存中的值。
  4. delete pa;使用delete释放已经开辟的空间。

2.3.2 连续空间的举例

代码如下:

#include <iostream>
using namespace std;

int main()
{
    int *pa=new int[10];
    int i=0;
    for(i=0;i<10;i++)
    {
        cout << pa[i] << ",";
    }
    cout << endl;
    cout << "-----------------------------" << endl;
    for(i=0;i<10;i++)
    {
        *(pa+i)=i;
    }
    for(i=0;i<10;i++)
    {
        cout << pa[i] << ",";
    }
    cout << endl;
    cout << "-----------------------------" << endl;
    int *pb=new int[10]{1,2,3};
    for(i=0;i<10;i++)
    {
        cout << pb[i] << ",";
    }
    delete []pa;
    delete []pb;
    return 0;
}

结果展示:
在这里插入图片描述

总结:

  1. int *pa=new int[10];此种连续开辟空间,是没有初始化的。内存中的值有很多是随机值的。
  2. 可以采用循环,或者采用int *pb=new int[10]{1,2,3};这种方式进行初始化。这是C++11的新语法。
  3. 如果是连续空间的开辟,一定要要使用delete[]的方式来释放。

三、自定义类类型中的new/delete

针对于内置类型而言,new大体相当mallocdelete大体相当于free

但是如果自定义类类型
new代表两种含义:开辟空间,调用类中的构造函数进行初始化
delete也代表两含义:即调用类中的析构函数,然后再释放空间

关于构造与析构在之后的文章会详细讲解,感兴趣可以关注一下!

代码如下:

#include <iostream>
using namespace std;
struct Stu
{
    Stu()
    {
        cout << "Stu的构造" << endl;
    }
    ~Stu()
    {
        cout << "Stu的析构" << endl;
    }
};

int main()
{
    Stu *pstu=new Stu;
    delete pstu;
    return 0;
}

结果展示:
在这里插入图片描述

四、new与delete的底层

首先调用new
在这里插入图片描述
在底层调用的还是malloc分配的空间
在这里插入图片描述
malloc申请空间失败返回NULL;
new申请空间失败抛出一个异常;
在这里插入图片描述

五、C++中new与malloc之间的联系与区别

5.1 new与malloc之间的联系

new的底层就是用malloc实现的。

5.2 new与malloc之间的区别

  1. malloc如果申请空间失败返回NULL,new如果申请空间失败抛出异常 bad_alloc();
  2. new就是按类型开辟空间的,而malloc是按字节为单位开辟空间的。
  3. new/delete 是C++的关键字,malloc/free是库函数
  4. new可以在分配空间的同时进行初始化,malloc不可以。
  5. 当new分配的空间以int *pc = new int();,这种形式的时候,如果没有初始化,将用0进行初始化。如果是以int *pc = new int形式出现的,则将是随机值。
    malloc分配的空间如果没有初始化,是随机值,需要手动调用memset或者bzero函数来清空。
  6. new会根据类型自动计算分配空间的大小,malloc需要手动sizeof计算,传参。
  7. new是要什么类型,就返回什么类型的指针,malloc返回void *,需要进行强转。

对自定义类型来讲:

new 不仅开辟空间,还会调用自定类中的构造函数,malloc不会。
delete 不仅释放空间,还会在释放空间前先调用类中析构函数,free不会。

  • 29
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
以下是一个简单的示例代码,展示了一个基本的征文投稿平台的前端界面和一些关键功能。这只是一个示例,你可以根据自己的需求进行修改和扩展。 HTML: ```html <!DOCTYPE html> <html> <head> <title>征文投稿平台</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <h1>征文投稿平台</h1> <form action="submit.php" method="post" enctype="multipart/form-data"> <label for="name">姓名:</label> <input type="text" id="name" name="name" required><br><br> <label for="email">邮箱:</label> <input type="email" id="email" name="email" required><br><br> <label for="title">文章标题:</label> <input type="text" id="title" name="title" required><br><br> <label for="abstract">摘要:</label> <textarea id="abstract" name="abstract" required></textarea><br><br> <label for="keywords">关键词:</label> <input type="text" id="keywords" name="keywords" required><br><br> <label for="file">上传文件:</label> <input type="file" id="file" name="file"><br><br> <input type="submit" value="提交"> </form> </body> </html> ``` CSS (style.css): ```css body { font-family: Arial, sans-serif; margin: 20px; } h1 { text-align: center; } form { width: 400px; margin: 0 auto; } label { display: inline-block; width: 100px; } input[type="text"], input[type="email"], textarea { width: 250px; padding: 5px; } input[type="submit"] { margin-left: 100px; padding: 10px 20px; background-color: #4CAF50; color: white; border: none; cursor: pointer; } ``` PHP (submit.php): ```php <?php // 获取表单提交的数据 $name = $_POST['name']; $email = $_POST['email']; $title = $_POST['title']; $abstract = $_POST['abstract']; $keywords = $_POST['keywords']; $file = $_FILES['file']; // 处理文件上传 $uploadDir = 'uploads/'; $uploadFile = $uploadDir . basename($file['name']); if (move_uploaded_file($file['tmp_name'], $uploadFile)) { echo "文件已上传成功!"; } else { echo "文件上传失败!"; } // 将数据保存到数据库或其他处理逻辑 // ... ?> ``` 这个示例代码包括一个HTML表单,其中包含姓名、邮箱、文章标题、摘要、关键词和文件上传字段。当用户提交表单时,数据将通过POST方法发送到submit.php文件进行处理。在submit.php文件中,你可以根据需要处理表单数据和文件上传,然后将数据保存到数据库或其他地方。 请注意,这只是一个基本示例,你可能需要根据实际需求进行修改和扩展。还需要添加服务器端的验证和安全性措施,以及进一步的后端处理逻辑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值