一、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