"new"和"malloc"都是在C++和C语言中用于动态分配内存空间的关键字/函数。
-
"new"关键字:在C++中,"new"关键字用于在堆上动态分配内存空间。它可以像以下方式使用:
int* ptr = new int; // 动态分配一个int类型的空间
"new"关键字会自动计算所需的内存大小,并返回一个指向分配内存的指针。在上面的例子中,"ptr"指向了新分配的int类型的内存空间。
-
"malloc"函数:在C语言中,"malloc"函数用于动态分配内存空间。它需要传入所需的内存大小,并返回一个指向分配内存的指针。可以像以下方式使用:
int* ptr = (int*)malloc(sizeof(int)); // 动态分配一个int类型的空间
注意,"malloc"函数返回的是
void*
类型的指针,需要进行类型转换。在上面的例子中,通过(int*)
进行了类型转换,将返回的指针转换为int*
类型。new和malloc底层原理
malloc 底层实现:
当开辟的空间小于 128K 时,调用 brk ()函数;当开辟的空间大于 128K 时,调用 mmap()。 malloc 采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将 堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。
new 底层实现: 关键字 new 在调用构造函数的时候实际上进行了如下的几个步骤:
1. 创建一个新的对象
2. 将构造函数的作用域赋值给这个新的对象(因此 this 指向了这个新的对象)
3. 执行构造函数中的代码(为这个新对象添加属性)
4. 返回新对象
new和malloc的区别
1. new 是操作符,而 malloc 是函数。
2. new 在调用的时候 先分配内存,在调用构造函数,释放的时候调用析构函数 ;而 malloc 没有构造函数和析构函数。
3. malloc 需要给定申请内存的大小, 返回的指针需要强转; new 会调用构造函数,不用指定内存的大小,返回指针不用强转。
4. new 可以被重载 ; malloc 不行
5. new 分配内存更直接和安全 。
6. new 发生错误抛出异常 , malloc 返回 null
不同之处:
- "new"是C++中的关键字,而"malloc"是C语言中的函数。
- "new"关键字可以自动计算所需的内存大小,而"malloc"函数需要手动传入所需的内存大小。
- "new"关键字会自动调用构造函数,"malloc"函数仅分配内存,不会对分配的空间进行初始化。
需要注意的是,如果使用"new"关键字分配内存空间,则需要使用"delete"关键字释放内存空间;如果使用"malloc"函数分配内存空间,则需要使用"free"函数释放内存空间。
标签:malloc,函数,int,关键字,new,构造函数 From: https://blog.csdn.net/weixin_62789590/article/details/141019140