new和malloc的区别

区别1:
 malloc是C的函数,New是C++的关键词。
 区别2:
 malloc的参数是字节长度,按照参数分配内存,内存空间大小由参数指定,单位字节;
New主要用来创建类、结构对象,当然它包含分配内存的工作,不同的是,分配内存时是按照类或结构的定义来确定要分配多少字节。同时当New一个对象时,还负责调用类的构造函数以便初始化对象成员。同时它也用来动态分配数组,同样的,数组所占字节是通过数组长度和元素类型来确定,用户不能也无需指定确切的内存大小,编译器会在编译时确定(长度*元素类型宽度=所需分配内存大小),用户只需指定需要分配多少个元素及元素类型。

据说实质上,当New确定好字节长度后,最终会调用malloc分配内存。(我没研究过,因为我觉得没意义)
 区别3:
 malloc可以说是通用内存分配函数,它无需知道所分配的内存用于保存什么类型的数据,它只知道需要分配多少字节内存,因此返回的指针是无类型的,也即虚指针。所以,如果你知道该内存空间所保存的数据类型,还需将虚指针强制转换为指定类型的指针。
New所创建的对象、结构、数组,都是可以确定数据类型的,因此返回的是指定的类型指针,无需强制转换,当然,C++具有很强的灵活性,你完全可以先New一个int类型的数组,然后强制转换成4倍空间char类型的数组,这完全没问题,只要数据对齐,保证不越界即可。

因此总体上简单地说malloc灵活,直白简单,但内存和指针维护麻烦,需要转换,需要注意数据对齐,New功能强,使用方便。

那么,针对你的例子,做下说明
(int*)malloc(100*sizeof(int)) 是先取得int类型的字节宽度,然后乘100计算后得到400,然后调用malloc,并将400传递给函数,分配400字节的内存空间,但是返回的是虚指针,即纯地址,该地址的类型是未知的,也即缺少数据宽度的信息。因此最后根据实际要求强制转换为int *。

new int[100]是分配可保存100个整数的内存空间,因为已给定数据类型,因此总共需要分配100*4=400字节的空间,返回int *类型的指针。

综上所述,你的例子中2者实际效果没区别,但是代码和编译过程不同,malloc,需要显式定义内存空间大小和返回指针,new是通过指定类型和元素长度然后编译器隐式计算内存大小,然后按指定类型返回对应的指针。
 
//注意
malloc的返回值是void类型的指针,既然是指针所以在强制类型转换时还是需要变成某种类型的指针。
所以具体用的时候需要强制类型转换。(elemptype*)malloc(sizeof(elemptype));
elemptype指的是这个指针指代的内存空间所保存的数据类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值