C++ 面试题 目录

C++ 中如何自定义 deleter?

推荐答案

在C++中,可以通过定义一个自定义的删除器(deleter)来管理动态分配的资源。自定义删除器通常与智能指针(如std::unique_ptrstd::shared_ptr)一起使用,以确保资源在不再需要时能够正确释放。

以下是一个使用std::unique_ptr自定义删除器的示例:

-- -------------------- ---- -------
-------- ----------
-------- --------

-- ------
------ ------------- -
    ---- --------------- ---- ----- -
        --------- -- ------- ------- ------- -------- -------- - -- --- -- ----------
        ------ ----
    -
--

--- ------ -
    -- ---------- ----------
    -------------------- -------------- ------- ---------

    -- ----
    --------- -- ------- - -- ---- -- ----------

    -- - --- ------------------
    ------ --
-

本题详细解读

1. 自定义删除器的定义

自定义删除器是一个可调用对象(如函数、函数对象或lambda表达式),它接受一个指向资源的指针作为参数,并负责释放该资源。在上面的示例中,CustomDeleter是一个函数对象,重载了operator(),用于释放int*类型的指针。

2. 使用自定义删除器的智能指针

在C++中,std::unique_ptrstd::shared_ptr都支持自定义删除器。std::unique_ptr的模板参数中第二个参数可以指定删除器的类型,而std::shared_ptr的删除器可以在构造函数中传递。

std::unique_ptr 示例

在这个示例中,CustomDeleter被指定为std::unique_ptr的删除器类型。当ptr超出作用域时,CustomDeleteroperator()会被自动调用,释放int*指针。

std::shared_ptr 示例

对于std::shared_ptr,删除器可以在构造函数中传递。当ptr的引用计数变为0时,CustomDeleter会被调用。

3. 自定义删除器的应用场景

自定义删除器在以下场景中非常有用:

  • 管理非标准资源(如文件句柄、数据库连接等)。
  • 需要特殊的资源释放逻辑(如日志记录、资源池管理等)。
  • 与C语言库交互时,需要自定义资源释放函数。

通过自定义删除器,可以确保资源在不再需要时能够正确释放,避免内存泄漏或其他资源泄漏问题。

纠错
反馈