C++中new和malloc的区别,底层涉及与实现等思考。 您所在的位置:网站首页 malloc库函数 C++中new和malloc的区别,底层涉及与实现等思考。

C++中new和malloc的区别,底层涉及与实现等思考。

2023-03-15 13:00| 来源: 网络整理| 查看: 265

在C++中,new和malloc都可以用于动态内存分配,但它们在语义和底层实现上存在一些重要的区别。

语法区别:

new用于在堆上分配内存并构造对象。语法为:

T* ptr = new T;

其中T是要分配的对象类型,ptr是指向新分配的内存的指针。

malloc仅分配指定大小的内存块。语法为:

void* ptr = malloc(size);

其中size是要分配的内存大小,ptr是指向新分配的内存的指针。

内存分配方式不同:

new在堆上分配内存,是C++运算符,会自动执行对象的构造函数。

malloc在堆上分配内存,是C库函数,只分配内存块,不会执行对象构造函数。如果需要在分配的内存块上构造对象,则需要显式地调用构造函数。例如:

T* ptr = (T*) malloc(sizeof(T)); new (ptr) T(); // 在ptr指向的内存块上构造对象

内存释放方式不同:

delete用于释放由new分配的内存,并自动执行对象的析构函数。语法为:

delete ptr;

free用于释放由malloc分配的内存,不会自动执行对象析构函数。语法为:

free(ptr);

需要注意的是,如果使用malloc分配内存块,并在上面构造了对象,需要在释放内存块之前手动调用析构函数,然后再调用free释放内存块。例如:

ptr->~T(); // 手动调用析构函数free(ptr); // 释放内存块

对象数组的分配和释放:

使用new可以方便地分配对象数组并执行对象构造函数,例如:

T* ptr = new T[N];

其中,N是对象数组的长度,ptr指向新分配的内存块。

使用malloc可以分配内存块,但需要手动为每个对象调用构造函数,例如:

T* ptr = (T*) malloc(N * sizeof(T)); for (int i = 0; i < N; ++i) { new (&ptr[i]) T(); // 手动调用构造函数 }

使用delete[]可以方便地释放对象数组并执行每个对象的析构函数,例如:

delete[] ptr;

使用free需要手动为每个对象调用析构函数,例如:

for (int i = 0; i < N; ++i) { ptr[i].~T(); // 手动调用析构函数 } free(ptr);

总的来说,new和malloc都可以用于动态内存,但是在使用上和底层实现上还有以下一些区别:

异常处理:

new在分配内存失败时,会抛出一个std::bad_alloc异常,方便程序员进行错误处理。而malloc在分配内存失败时,只会返回一个空指针,程序员需要手动检查空指针并进行错误处理。

内存对齐:

new会保证分配的内存块对齐到对象的对齐要求。而malloc只会保证分配的内存块对齐到alignof(std::max_align_t)(C++11之后的标准)的要求。

多线程安全:

new和delete默认是多线程安全的,可以使用-pthread选项编译。而malloc和free则需要在多线程环境下使用锁来保证安全。

内存管理策略:

new和delete的实现通常使用内存池等高效的内存管理策略,可以提高内存分配和释放的性能。而malloc和free则没有内存池等高效的内存管理策略。

底层实现上,new和delete是C++编译器内置的运算符,通常会调用C++标准库中的operator new和operator delete函数来进行内存分配和释放。这些函数会根据实际情况使用系统调用(如mmap和munmap)来向操作系统申请和释放内存。而malloc和free则是C语言库函数,使用brk和sbrk等系统调用来进行内存分配和释放。由于C++标准库的实现比C语言库更复杂,因此new和delete的性能通常比malloc和free更高。

所以,虽然new和malloc都可以用于动态内存分配,但语义和底层实现存在差异,需要根据具体情况选择合适的函数来进行内存分配和释放。

如果帮到你了,就点个赞吧~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有