c语言是面向对象的编程语言吗,不支持面向对象的编程语言

首页 > 教育培训 > 作者:YD1662023-06-19 12:07:49

9、malloc,free && new,delete

这个问题很有意思,也是重点需要关注的问题。malloc()和free()是C语言中动态申请内存和释放内存的标准库中的函数。而new和delete是C 运算符、关键字。new和delete底层其实还是调用了malloc和free。它们之间的区别有以下几个方面:

1)、malloc和free是函数,new和delete是运算符。

2)、malloc在分配内存前需要大小,new不需要。

例如:int *p1 = (int *)malloc(sizeof(int));

int *p2 = new int; //int *p3 = new int(10);

malloc时需要指定大小,还需要类型转换。new时不需要指定大小因为它可以从给出的类型判断,并且还可以同时赋初始值。

c语言是面向对象的编程语言吗,不支持面向对象的编程语言(17)

3)、malloc不安全,需要手动类型转换,new不需要类型转换。

4)、free只释放空间,delete先调用析构函数再释放空间(如果需要)。

与第⑤条对应,如果使用了复杂类型,先析构再call operator delete回收内存。

5)、new是先调用构造函数再申请空间(如果需要)。

与第④条对应,我们在调用new的时候(例如int *p2 = new int;这句代码 ),底层代码的实现是:首先push 4字节(int类型的大小),随后call operator new函数分配了内存。由于我们这句代码并未涉及到复杂类型(如类类型),所以也就没有构造函数的调用。如下是operator new的源代码,也是new实现的重要函数:

c语言是面向对象的编程语言吗,不支持面向对象的编程语言(18)

我们可以看到,首先malloc(size)申请参数字节大小的内存,如果失败(malloc失败返回0)则进入判断:如果_callnewh(size)也失败的话,抛出bad_alloc异常。_callnewh()这个函数是在查看new handler是否可用,如果可用会释放一部分内存再返回到malloc处继续申请,如果new handler不可用就会抛出异常。

c语言是面向对象的编程语言吗,不支持面向对象的编程语言(19)

6)、内存不足(开辟失败)时处理方式不同。

malloc失败返回0,new失败抛出bad_alloc异常。

7)、new和malloc开辟内存的位置不同。

malloc开辟在堆区,new开辟在自由存储区域。

8)、new可以调用malloc(),但malloc不能调用new。

new就是用malloc()实现的,new是C 独有malloc当然无法调用。

10、作用域

C语言中作用域只有两个:局部,全局。C 中则是有:局部作用域,类作用域,名字空间作用域三种。

所谓名字空间就是namespace,我们定义一个名字空间就是定义一个新作用域。访问时需要以如下方式访问(以std为例)

std::cin<<"123" <<std::endl;

例如我们有一个名字空间叫Myname,其中有一个变量叫做data。如果我们希望在其他地方使用data的话,需要在文件头声明:using Myname::data;这样一来data就使用的是Myname中的值了。可是这样每个符号我们都得声明岂不是累死?

c语言是面向对象的编程语言吗,不支持面向对象的编程语言(20)

上一页12345下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.