Skip to content

Instantly share code, notes, and snippets.

@pengdu
Created August 8, 2023 09:34
Show Gist options
  • Save pengdu/c1d2569a4b06e87a87b84e799009109c to your computer and use it in GitHub Desktop.
Save pengdu/c1d2569a4b06e87a87b84e799009109c to your computer and use it in GitHub Desktop.
chatgpt 自定义deleter

在C++中,我们可以自定义一个deleter来管理智能指针的资源释放。通过自定义deleter,我们可以在智能指针析构时执行我们自己的释放逻辑。

下面是一个示例,展示如何自定义deleter来管理一个动态分配的数组:

#include <iostream>
#include <memory>

struct MyArrayDeleter {
    template<typename T>
    void operator()(T* ptr) const {
        std::cout << "Custom deleter is called." << std::endl;
        delete[] ptr;
    }
};

int main() {
    std::unique_ptr<int[], MyArrayDeleter> arr(new int[5]);
    
    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
    }
    
    for (int i = 0; i < 5; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

在这个示例中,我们定义了一个名为MyArrayDeleter的自定义deleter。它是一个函数对象,重载了operator(),使得它可以像函数一样被调用。

operator()中,我们实现了我们自己的释放逻辑,即使用delete[]来释放动态分配的数组。

main函数中,我们使用std::unique_ptr来管理一个动态分配的整型数组,并指定了我们自定义的deleter类型MyArrayDeleter。我们可以通过arr[i]的方式来访问数组元素。

std::unique_ptr的生命周期结束时,它会自动调用我们自定义deleter的operator(),执行我们的释放逻辑。在这个示例中,我们在自定义deleter的operator()中输出一条消息,以确认我们的自定义deleter被正确调用。

希望对你有帮助!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment