C++基础面试题, C++ 中 new 和 malloc 的区别?delete 和 free 的区别?
C++基础面试题, C++ 中 new 和 malloc 的区别?delete 和 free 的区别?
QA
Step 1
Q:: C++
中 new 和 malloc 的区别是什么?
A:: new 是 C++ 中的运算符,用于动态分配内存,并自动调用相应类的构造函数。而 malloc 是 C 标准库中的函数,只分配内存,不调用构造函数。new 返回的是对象类型的指针,而 malloc 返回的是 void*,需要进行类型转换。此外,new 分配失败时会抛出 std::
bad_alloc 异常,而 malloc 返回 NULL。
Step 2
Q:: delete 和 free 的区别是什么?
A:: delete 是 C++
中用于释放通过 new 分配的内存,并调用对象的析构函数,而 free 是 C 标准库函数,用于释放 malloc 分配的内存,但不会调用析构函数。如果使用 delete 释放 malloc 分配的内存,或用 free 释放 new 分配的内存,可能会导致未定义行为。
Step 3
Q:: 为什么 new 和 delete 会调用构造函数和析构函数?
A:: C++
是面向对象的编程语言,new 和 delete 调用构造函数和析构函数是为了支持对象的生命周期管理。当使用 new 创建对象时,需要初始化该对象,调用构造函数可以保证对象的正确初始化。而在 delete 对象时,析构函数确保资源的正确释放。
Step 4
Q:: new 和 delete 是否可以重载?如果可以,如何重载?
A:: 是的,new 和 delete 可以被重载。通过重载 new,开发者可以定制内存分配的方式,比如增加内存池或进行日志记录。同样,重载 delete 可以定制内存释放的方式。重载时需要遵循特定的函数签名:void* operator new(size_t size)
和 void operator delete(void* ptr)
。
Step 5
Q:: 在实际编程中,何时应该使用 new/delete 而不是 malloc/
free?
A:: 在 C++ 编程中,如果涉及到对象的构建和析构,应该使用 new/delete,因为它们能够确保构造函数和析构函数被正确调用。如果只是简单的内存分配而不涉及对象的初始化或清理,malloc/
free 可能更合适,尤其是在需要与 C 库交互时。