面试题答案
一键面试- 问题:
- 当使用
std::unique_ptr
管理多态对象数组时,由于std::unique_ptr
默认的删除器使用delete
而不是delete[]
,在析构数组时会导致未定义行为。因为delete
用于释放单个对象,delete[]
用于释放数组对象,对数组对象使用delete
会造成内存错误。
- 当使用
- 解决方法:
- 可以自定义删除器,让
std::unique_ptr
使用delete[]
来释放数组。
- 可以自定义删除器,让
- 原理:
std::unique_ptr
的第二个模板参数是删除器类型。通过提供一个使用delete[]
的删除器,我们可以确保在std::unique_ptr
析构时,多态对象数组能被正确释放。
- 示例代码:
#include <iostream>
#include <memory>
class Base {
public:
virtual ~Base() { std::cout << "Base destructor" << std::endl; }
};
class Derived : public Base {
public:
~Derived() { std::cout << "Derived destructor" << std::endl; }
};
// 自定义删除器
struct ArrayDeleter {
template <typename T>
void operator()(T* ptr) const {
delete[] ptr;
}
};
int main() {
// 使用自定义删除器的std::unique_ptr管理多态对象数组
std::unique_ptr<Base, ArrayDeleter> arr(new Derived[3]);
return 0;
}
在上述代码中:
- 定义了基类
Base
和派生类Derived
,都有虚析构函数。 - 定义了一个自定义删除器
ArrayDeleter
,它使用delete[]
来释放对象。 - 在
main
函数中,使用std::unique_ptr<Base, ArrayDeleter>
来管理Derived
对象数组,这样在std::unique_ptr
析构时,会调用自定义删除器正确释放数组内存。