malloc和new对比,Linux进程的五个段

1、如何在不知道数组个数的情况下动态输入数组?
答:c语言里这样是不行的,只能使用动态分配内存。

//C语言
int *a;
a=(int *)malloc(sizeof(int)*n);
//C++
int *a=new int[n];

2、C语言的malloc和C++的new有什么区别?
答:(1)申请内存所在位置
new操作符从自由存储区(free store:凡是通过new操作符进行内存申请,该内存即为自由存储区,可以是堆也可以是静态存储区,这取决于operator new的实现细节)上为对象动态分配内存空间;malloc从堆上动态分配内存。
(2)返回类型安全性
new分配内存成功是返回对象类型的指针,类型严格与对象匹配,无需进行类型转换,故new是符合类型安全性的操作符;而malloc内存分配成功返回void*,需要通过强制类型转换将void *指针转换成我们需要的类型。
(3)内存分配失败的返回值
new会抛出bad_alloc异常,而malloc返回NULL。

int n=10;
int a* = (int *)malloc(sizeof(int)*n);
if(a==NULL){
	...
}
else{
	...
}
try{
	int *a = new int();
}
catch(bad_alloc){
	...
}

(4)是否需要指定内存大小
new无需指定,编译器会根据类型自行计算;malloc需要显式指定
(5)是否调用构造函数/析构函数
new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构,而malloc不会。
new:①调用operator new函数分配一块足够大、原始、未命名的内存空间;②编译器运行相应的构造函数以构造对象,为其传入初值;③兑现构造完成购,返回一个指向该对象的指针
delete:①调用对象的析构函数;②编译器调用operator ndelete函数释放内存空间
(6)数组
C++提供了new[ ]和delete[ ]专门处理数组;mallo分配时c需要手动定义数组的大小

A * ptr = new A	[10];
delete[] ptr;
int * ptr=(int*)malloc(sizeof(int)*10);

3、Linux进程的五个段:数据段、代码段、BSS段、堆栈段
答:段(segmentation)是指二进制文件内的区域。进程对应的内存空间包含5个不同的数据区。
在可执行文件中,正文段/代码段(text segment / code segment)用于存储指令;数据段(data segment)存储已初始化的全局变量,BSS段(BSS segment)存储未赋值的的全局变量所需的空间。
调用栈躲在的段称为堆栈段(stack segment)。它不存储咋爱可执行文件中,而是在运行时创建。
所有段均有自己的大小,均不可越界访问,都则出现段错误(segmentation fault),越界会产生栈溢出(stack overflow)。

段名称作用
BSS存放程序中未初始化的全局变量;属于静态内存分配
数据段存放程序中已初始化的全局变量,如static声明的变量;属于静态内存分配
代码段存放程序执行代码的一块内存区域;这部分区域的大小在程序运行前就已经确定,且内存区域通常只读;代码段也可能包含一些只读常数变量,如字符串常量等
堆(heap)存放进程运行中被动态分配的内存段,大小不固定,可动态扩张。需释放,否则可能内存泄漏导致系统不稳定【tips:Windows系统在该进程退出时由OS释放,Linux则旨在整个系统关闭时OS才会释放】
栈(stack)存放程序临时创建的局部变量(函数弧{}中定义的变量除static),函数被调用时其参数也会压入发起调用的进城栈,调用结束后函数返回值也会被存放会栈中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值