首页 >后端开发 >C++ >std::shared_ptr 如何在关闭时进行任意清理?

std::shared_ptr 如何在关闭时进行任意清理?

Susan Sarandon
Susan Sarandon原创
2024-10-30 14:34:11432浏览

How does std::shared_ptr<void> 可以在关机时进行任意清理吗? 
可以在关闭时进行任意清理吗? " />

为什么 std::shared_ptr 有效

尽管有预期,std::shared_ptr 可用于在关闭时执行任意清理,即使使用 std::shared_ptr 也是如此;. 这种行为源于类型擦除,这是 std::shared_ptr 实现的一个组成部分。

类型擦除

当创建shared_ptr时,它封装了拥有的指针与删除器函数一起。该函数通常默认调用delete,但可以通过构造函数进行不同的配置。在销毁shared_ptr时,将调用存储的删除器,从而触发对象的清理。

要了解类型擦除,考虑以下使用 std::function:

<code class="cpp">template <typename T>
void delete_deleter(void *p) {
    delete static_cast<T *>(p);
}

template <typename T>
class my_unique_ptr {
public:
    my_unique_ptr(T *p, void(*deleter)(void *p) = &delete_deleter<T>) 
        : p(p), deleter(deleter) 
    {}

    ~my_unique_ptr() {
        deleter(p);
    }

private:
    T *p;
    void(*deleter)(void *);
};

int main() {
    my_unique_ptr<void> p(new double);
}</code>

的简化示例,这里, my_unique_ptr 可以从任何类型的指针构造,删除器存储特定于类型的删除函数。析构函数在清理期间被调用。

std::shared_ptr 和类型擦除

共享指针也使用类型擦除。当从另一个复制或默认构造一个shared_ptr时,删除器信息将被保留。这意味着shared_ptr从一个shared_ptr构造保持必要的知识来调用适当的析构函数,即使强制转换为shared_ptr

根据C 标准,这种行为是得到保证的。实现不能以破坏此功能的方式更改 std::shared_ptr 的内部结构。因此,使用 std::shared_ptr进行任意清理是一种合法且可靠的技术。

以上是std::shared_ptr 如何在关闭时进行任意清理?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn