malloc free和new delete的使用

1、malloc
 c和c++,都有,申请空间后必须手动释放,但是在申请类的空间的时候,不会自动调用构造函数。

2、new
 c++专有,申请空间后可以自动进行空间回收,而且申请类的空间的时候,可以自动调用构造函数。

3、free(与malloc对应)和delete(与new对应)
通过free释放空间的时候不会自动调用类的析构函数,但是delete会自动调用类的析构函数。

4.只要是内存模型相同,指向已经申请空间的数据 的引用类型数据也是可以释放所申请的空间的

测试代码:

#include<iostream>
using namespace std;

struct Str
{
     int x;
     int y;
};

int main()
{
    Str* a=(Str*)malloc(sizeof(Str*)*2);
    a->x = 11;
    a->y = 22;
    a[1].x=33;
    a[1].y=44;
    Str* test=a;
    free(test);
    return 0;
}

在free(test)之前断点提示,内存分配如下图所示:

在free(test)之后断点提示,内存分配如下图所示:

  
由前后的调试结果可知:

1. 同类型的引用类型数据也可以释放其他指针所申请的空间。(其实不同类型的引用类型数据也可以释放其他指针所申请的空间)。如下图所示:

代码区别: void * test=(void *)a;
 


ps1:
当使用malloc申请多个内存地址, 比如上面的代码就是2个机构体的内存地址空间,此时当问需要使用数组方式
 
ps2:
野指针的问题,我们通过断点调试发现,当申请的内存空间被释放后,但是指针依然会指向原来所指的位置,这样会给以后造成负面影响,比如拿原来的指针进行了误操作,为了避免此类问题 ,我们需要在空间被释放后,对指针赋NUll值,即:
test=NUll;
malloc申请二维数组

#include <malloc.h>
#include <stdio.h>
int main()
{
    int (*a)[2] = (int(*)[2])malloc(sizeof(int)*3*2);
    a[0][0] =1;
    a[0][1] =2;
    a[1][0] =3;
    a[1][1] = 4;
    a[2][0] =5;
    a[2][1] = 6;
    printf("%d\t%d\t%d\t%d\t%d\t%d\n",a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1]); 
    free(a);
    system("pause");
}




或者:
#include <malloc.h>
#include <stdio.h>
int main()
{
    int **a = (int**)malloc(sizeof(int)*3);
    a[0]=(int*) malloc(sizeof(int)*2);
    a[1]= (int*)malloc(sizeof(int)*2);
    a[2]= (int*)malloc(sizeof(int)*2);
    a[0][0] =1;
    a[0][1] =2;
    a[1][0] =3;
    a[1][1] = 4;
    a[2][0] =5;
    a[2][1] = 6;
    printf("%d\t%d\t%d\t%d\t%d\t%d\n",a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1]); 
    free(a[0]);
    free(a[1]);
    free(a[2]);
    free(a);
    system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: mallocfree是C语言中的动态内存分配和释放函数,用于在程序运行时动态地分配和释放内存空间。malloc函数用于分配一块指定大小的内存空间,free函数用于释放已分配的内存空间。 newdeleteC++语言中的动态内存分配和释放运算符,用于在程序运行时动态地分配和释放内存空间。new运算符用于分配一块指定大小的内存空间,并返回指向该内存空间的指针,delete运算符用于释放已分配的内存空间。 总的来说,mallocfree是C语言中的动态内存分配和释放函数,newdeleteC++语言中的动态内存分配和释放运算符。它们的使用方法和功能类似,但是在C++中,newdelete还可以用于对象的构造和析构。 ### 回答2: 1. mallocfree 它们是C语言中的动态内存分配和释放函数,用于动态分配和释放内存,即在程序运行时根据需要从系统堆中分配出一块连续的、指定大小的内存,并返回指向这块内存的指针;当程序不需要使用这块内存时,使用free函数将其释放回内存堆。由于mallocfree是C语言中的函数,因此在使用时需要手动指定内存大小,且不支持自动释放内存。 2. newdelete 它们是C++语言中的动态内存分配和释放方式,和malloc/free相比,newdelete更加方便、安全,且支持自动释放内存。new关键字可以自动计算需要的内存大小并返回对应类型的指针,delete关键字可以自动释放内存,而无需手动指定内存大小。 newdelete的内存管理是面向对象的,它们可以调用构造函数和析构函数来初始化和清除对象,可以确保正确的内存布局和类型安全,这对于C++编程来说非常重要。 3. 区别对比 从功能上来说,mallocfree是C语言中的函数,用于动态内存分配和释放,需要手动指定内存大小,不支持自动释放内存;而newdeleteC++语言中的关键字,支持自动计算内存大小、自动调用类型的构造函数和析构函数、自动释放内存。 从安全性和易用性上来说,new/deletemalloc/free更安全、更方便,由于支持自动计算内存大小和类型安全,可以避免因内存管理不当而发生错误。同时,new/delete也更加适用于面向对象的程序设计,可以自动调用构造函数和析构函数,确保对象的正确创建、初始化和清除。因此,在C++编程中,建议使用newdelete来进行动态内存管理。 总之,malloc/freenew/delete都是动态内存管理的方式,根据不同编程语言和场景需求,选择适合的动态内存分配和释放方式非常重要,同时注意内存分配和释放的规范和安全性。 ### 回答3: mallocfreenewdelete 都是用于动态内存分配和释放的关键字。它们在使用方式、机制、效率和能力上存在差异。 1. mallocfree malloc 是 C/C ++ 程序中用于动态分配内存的函数,它会根据用户的需求分配一块指定大小的内存块并返回其首地址,通常用于分配结构体或数组等动态内存。而 free 用于释放之前分配的由 malloc 分配的内存块,将内存块标记为可重用状态。 虽然 mallocfree 可以做到动态分配和释放内存,但是它们却没有处理对象的构造和析构,因此在使用过程中,如果需要先执行构造函数再分配空间或者先释放空间再执行析构函数,就需要用到以下两个关键字。 2. newdelete newdeleteC++ 中的关键字,它们不仅可以进行动态内存的分配和释放,而且还可以调用对象的构造和析构函数,能够在对象构造时自动执行构造函数,在对象销毁时自动执行析构函数,因此是一种更高级别的内存管理方式。 new 用于分配动态内存并调用构造函数来初始化对象,而 delete 用于调用析构函数并释放分配的内存,从而在对象生命周期的开头和结尾负责构造函数和析构函数的调用。 总之,mallocfree 是 C 语言的标准库关键字,而 newdeleteC++ 的关键字,它们之间的区别在于对于对象是否需要额外的构造函数和析构函数的调用等方面。因此,在实际的开发过程中,应根据需要选择合适的内存分配和释放方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值