c – 在shared_ptr的自定义删除中检查nullptr是否有意义?

c – 在shared_ptr的自定义删除中检查nullptr是否有意义?,第1张

概述我看到一些代码,使用std :: shared_ptr与一个自定义的删除器来测试nullptr的参数,例如MyClass,它有一个close()方法,并用一些CreateMyClass构造: auto pMyClass = std::shared_ptr<MyClass>(CreateMyClass(), [](My 我看到一些代码,使用std :: shared_ptr与一个自定义的删除器来测试nullptr的参数,例如MyClass,它有一个close()方法,并用一些CreateMyClass构造:
auto pMyClass = std::shared_ptr<MyClass>(CreateMyClass(),[](MyClass* ptr)                                        {                                             if(ptr)                                                 ptr->close();                                         });

在删除器中测试ptr的空值是否有意义?
这可能发生吗?怎么样?

解决方法 构造函数std :: shared_ptr< T> :: shared_ptr(Y * p)要求删除p是有效的 *** 作.当p等于nullptr时,这是一个有效的 *** 作.

构造函数std :: shared_ptr< T> :: shared_ptr(Y * p,Del del)要求del(p)是有效的 *** 作.

如果您的自定义删除器无法处理p等于nullptr,那么在shared_ptr的构造函数中传递null p是无效的.

您提供的构造函数可以更好地呈现,因此:

#include <memory>struct MyClass {    voID open() {        // note - may throw    };    voID close() noexcept {        // pre - is open    }};struct Closer{    voID operator()(MyClass* p) const noexcept    {        p->close();        delete p;  // or return to pool,etc    }};auto CreateMyClass() -> std::unique_ptr<MyClass,Closer>{    // first construct with normal deleter    auto p1 = std::make_unique<MyClass>();    // in case this throws an exception.    p1->open();    // Now it's open,we need a more comprehensive deleter    auto p = std::unique_ptr<MyClass,Closer> { p1.release(),Closer() };    return p;}int main(){    auto sp = std::shared_ptr<MyClass>(CreateMyClass());}

请注意,shared_ptr现在不可能拥有一个空对象.

总结

以上是内存溢出为你收集整理的c – 在shared_ptr的自定义删除中检查nullptr是否有意义?全部内容,希望文章能够帮你解决c – 在shared_ptr的自定义删除中检查nullptr是否有意义?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1251047.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存