在C++中,malloc
和 free
来自C语言,而 new
和 delete
是C++的运算符,它们都用于动态内存分配和释放,但有一些关键的区别:
malloc 和 free
- 语法:
void* malloc(size_t size);
:分配指定大小的内存块,返回一个指向它的指针。void free(void* ptr);
:释放之前分配的内存块。
- 类型:
malloc
返回一个void*
类型的指针,你可能需要显式地转换它到需要的指针类型。 - 构造函数和析构函数:
malloc
和free
不调用构造函数或析构函数。它们只分配和释放内存,不执行任何对象构造或析构。 - 错误处理:
malloc
在失败时返回nullptr.
new 和 delete
- 语法:
new T;
或new T(args);
:分配类型为T
的对象,并调用其构造函数。new[] T;
或new[] T(args);
:分配类型为T
的数组,并调用每个元素的构造函数。delete ptr;
:释放单个对象,并调用其析构函数。delete[] ptr;
:释放对象数组,并调用每个元素的析构函数。
- 类型:
new
根据分配的类型自动确定返回的指针类型。 - 构造函数和析构函数:
new
和delete
自动调用对象的构造函数和析构函数。 - 错误处理:
new
在失败时抛出一个std::bad_alloc
异常,除非使用了new (nothrow)
,这种情况下它会返回nullptr
。
此外,可以看出malloc使用时需手动计算分配内存大小,而new可以自动计算.
链表与数组的区别常见回答包括有链表不支持随机访问,插入,删除,取地址等操作的时间复杂度不同,分配地址联系不连续的区别,以及是否可以自定义大小等,而从容器角度看,list容器的实现原理是双链表,而vector容器的实现原理是动态数组.