首页 > 其他分享 >new与malloc

new与malloc

时间:2024-11-06 18:19:06浏览次数:3  
标签:malloc int 程序 内存 new 指针

一、new

new是操作符,利用new在堆区开辟数据,开辟的数据需要手动开辟,在使用结束后用delete手动释放,利用new创建的数据,会返回该数据对应的类型指针

用法1:

在堆区申请一块空间存放一个数

#include<iostream>
using namespace std;
int*fun(){
    //new在堆区申请内存,返回的是申请到的内存的地址
    int*p=new int(10);//在堆区申请一个内存,存的是数组10
    //申请数用().
        return p;
}
int main(){
    int*p1=fun();
    cout<<*p1<<endl;
    delete p1;
    return 0;
    }

用法2:

创建数组

#include<iostream>
using namespace std;
int* fun(int n) {
    int* p = new int[n];//在堆区申请一个内存,存的是一个数组包含n个元素,
 //new返回的是首元素地址,申请数组用[].
    for (int i = 0; i < n; i++) {
        cin >> p[i];
    }
    return p;
}
int main(){
    int n;
    cin>>n;
    int*p1=fun(n);
    for(int i=0;i<n;i++){
        cout<<p1[i]<<" ";    
    }
    delete[]p1;//释放怕指向的堆区数组,释放数组必须加[],
    //否则只会释放数组中的第一个元素
    return 0;
}

二、malloc

C语言库函数动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。malloc申请的空间要用free函数释放。

1)在使用malloc时,若类型不匹配需要强转

2)在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。

3)在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配

语法:

指针=(指针类型*)malloc(sizeof(指针类型)*数量)

int *p=NULL;
int a=2;
p=(int*)malloc(sizeof(int)*a);

注意:当malloc分配失败时会导致一下问题:

一、程序异常终止。

如果没有对 malloc 的返回值进行检查,并且后续代码直接使用了可能为 NULL 的指针,那么在访问该指针指向的内存时,可能会导致程序崩溃。

int* ptr = (int*)malloc(sizeof(int));
 *ptr = 10; // 如果 malloc 失败返回 NULL,这里会导致程序崩溃 

二、数据丢失或错误结果。

如果在一个复杂的程序中,malloc 失败后没有被正确处理,可能会导致部分数据无法正确存储,进而在后续的计算中产生错误的结果。比如在一个数据处理程序中,需要动态分配内存来存储大量数据,如果分配失败但程序继续运行,可能会导致部分数据丢失或计算结果错误。

三、资源泄漏。

如果 malloc 失败后,程序没有正确地清理已经分配的资源,可能会导致资源泄漏。例如,如果在一个循环中多次分配内存,当某次 malloc 失败后,如果没有正确释放之前分配的内存,就会导致内存资源逐渐耗尽。

四、难以调试的错误 。由于 malloc 失败可能在程序的任何地方发生,并且可能与特定的输入数据或程序状态相关,这使得错误难以重现和调试。特别是在大型程序中,可能需要花费大量时间来确定 malloc 失败的原因和位置。 为了避免这些问题,在使用 malloc 时,应该始终检查其返回值,并在分配失败时采取适当的错误处理措施,例如释放已分配的资源、输出错误信息并终止程序,或者尝试采取其他策略来减少内存使用。

三、new与malloc的区别:

1.从返回值的角度来看:new返回值不需要强转,malloc的返回值需要强转

2.从名字的角度来看: new是运算符,malloc 是库函数

3.从参数的角度来看: new 不需要传入具体的字节个数,malloc需要传入具体的字节个数

4.从函数体的角度来看:在使用new创建一个类的对象时会先调用malloc 分配内存空间,然后调用构造函数给成员变量赋值

5.从申请失败的角度来看: new抛出一个异常,malloc 返回空

标签:malloc,int,程序,内存,new,指针
From: https://blog.csdn.net/2401_88249494/article/details/143576614

相关文章

  • 2024newstarweb题解
    w1headach3会赢吗源码flag碎片X1:ZmxhZ3tXQTB3再次查看源码flag碎片X2:IV95NF9yM2Fs第三个页面也是直接查看源码直接改源码flag碎片X3:MXlfR3I0c1B下一个页面直接禁用jsflag碎片X4:fSkpKcyF9ZmxhZ3tXQTB3IV95NF9yM2FsMXlfR3I0c1BfSkpKcyF9base64解码即......
  • NewStar CTF 2024 misc WP
    decompress压缩包套娃,一直解到最后一层,将文件提取出来提示给出了一个正则,按照正则爆破密码,一共五位,第四位是数字 ^([a-z]){3}\d[a-z]$一共就五位数,直接ARCHPR爆破,得到密码xtr4m,解压得到flagpleasingMusic题目描述中提到:一首歌可以好听到正反都好听根据提示(其实也能听出来后半段......
  • Golang new() make var []int 使用的具体区别
    一、数组和切片的初始化1var []int 格式funcmain(){ vart1[]int t1=append(t1,1) fmt.Println(t1)//正常输出1 vart11[]int t11[0]=11//panic:runtimeerror:indexoutofrange[0]withlength0 fmt.Println(t11) vart12[1]int t12[0]=......
  • 帝国CMS根据新闻正文字段[newstext]批量重新生成简介字段[smalltext]
    步骤:设置自动生成简介的字数:进入帝国CMS后台,设置自动获取简介的字数(默认160,可以改为320)。编写处理PHP脚本:创建 auto_smalltext.php 文件,内容如下:<?phpdefine('EmpireCMSAdmin','1');require("../class/connect.php");require("../class/db_sql.php");req......
  • YLCTF-Web-404 And NewStarctf2024-Web-你能在一秒内打出八句英文吗
    YLCTF-Web-404打开网页啥也没有在扫描网站和源码的js文件中找到了线索404.php跟进查看发现确实是404,但是和正常的404页面好像不太一样bp抓包得到下一关线索ca.php跟进查看,一道经典的代码题目expimportrequestsfrombs4importBeautifulSoupimportmath#......
  • NewStar easygui re wp
    NewStareasyguirewp参考题解:NewStarCTFweek4-CSDN博客提示先去看消息机制:深入理解windows消息机制_⒉消息队列发送消息,消息的标识可以从键盘获取,-CSDN博客大概看下64位无壳shift+f12没找到关键字符串,看看函数有个winmain点进去,都是些系统函数发现sub_14000149......
  • C# serialize big collection via NewtonSoft.Json
    System.OutOfMemoryExceptionHResult=0x8007000EMessage=Exceptionoftype'System.OutOfMemoryException'wasthrown.Source=mscorlibStackTrace:atSystem.Text.StringBuilder.ToString()atSystem.IO.StringWriter.ToString()atNewto......
  • 内存管理相关——malloc,mmap,mlock与unevictable列表
    一、背景之前的内核内存子系统的章节里已经介绍了内存回收有关的MIGRATE_TYPE的概念并做了不少的相关实验。详细见我之前写的博客 内存回收相关内核基础概念——MIGRATE_TYPE_kreclaimable没有回收-CSDN博客。锁内存相关的常用函数有四个,SetPageReserved/mlock/get_user_pa......
  • c语言:动态内存管理中的malloc和free,calloc和realloc
    为什么要有动态内存分配?通过之前的学习,我们已经掌握的内存开辟方式有:inta=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间上述空间的开辟的大小是固定的数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小不能进行调整。......
  • Vue项目在安装依赖时报错:this[kHandle] = new _Hash(algorithm, xofLen)
    原因:这个错误通常是由于Node.js版本更新导致的。新版本的Node.js包含了OpenSSL3.0,它对加密算法和密钥大小有更严格的限制,可能会影响一些旧项目。解决方案:临时解决(需要每次启动时设置):在VSCode终端中:$env:NODE_OPTIONS="--openssl-legacy-provider"在WindowsCMD......