Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时对std::shared\u ptr使用自定义删除程序 我使用C++ STD::SysDypPTR,想知道除了DELTE PTR之外,还有其他自定义DELTER的使用。或者,在什么情况下建议为共享的\u ptr提供自定义删除器?您不必明确地拼写删除器。但是该类需要具有允许各种类型擦除的特性,例如从任何唯一的_C++ - Fatal编程技术网

何时对std::shared\u ptr使用自定义删除程序 我使用C++ STD::SysDypPTR,想知道除了DELTE PTR之外,还有其他自定义DELTER的使用。或者,在什么情况下建议为共享的\u ptr提供自定义删除器?您不必明确地拼写删除器。但是该类需要具有允许各种类型擦除的特性,例如从任何唯一的

何时对std::shared\u ptr使用自定义删除程序 我使用C++ STD::SysDypPTR,想知道除了DELTE PTR之外,还有其他自定义DELTER的使用。或者,在什么情况下建议为共享的\u ptr提供自定义删除器?您不必明确地拼写删除器。但是该类需要具有允许各种类型擦除的特性,例如从任何唯一的,c++,C++,您有时也可以对其他类型的删除器使用自定义的删除器,尽管大多数情况下,唯一的\u ptr可能更适合这些情况。您不必明确地拼写删除器。但是该类需要具有允许各种类型擦除的特性,例如从任何唯一的

您有时也可以对其他类型的删除器使用自定义的删除器,尽管大多数情况下,
唯一的\u ptr
可能更适合这些情况。

您不必明确地拼写删除器。但是该类需要具有允许各种类型擦除的特性,例如从任何
唯一的
构造
共享的
,从任何
共享的
构造
共享的
。当您第一次创建对象时,默认的删除器就在那里,它们会随着所有这些转换而传播


您有时可以将自定义删除器用于其他类型的,尽管大多数情况下,
unique\u ptr
对于这些情况可能更合适、更充分。

据我所知,使用删除器可以实现两个目标

  • 为您提供一种覆盖
    删除ptr的方法(如你所说)
  • 使共享_ptr和唯一_ptr不能与前向声明类一起使用
    据我所知,德雷特队实现了两个目标

  • 为您提供一种覆盖
    删除ptr的方法(如你所说)
  • 使共享_ptr和唯一_ptr不能与前向声明类一起使用
    delete
    无法执行您想要的操作时,您需要一个自定义删除程序。考虑不同的场景:

    从池中获取内存,并使用“新放置”创建对象。在未使用
    new
    创建的对象上调用
    delete
    将是未定义的行为,因此您需要插入将使用适当内存池的删除程序。这适用于使用
    malloc
    获取并使用
    free
    释放的内存,例如,或任何其他类型的内存分配器。这也适用于从不同堆获取的内存


    该资源甚至不是内存,而是文件描述符、数据库连接等。当没有对该资源的引用时,删除程序需要释放该资源,但释放该资源并不涉及调用
    delete
    ,但是还有其他一些操作。

    删除
    无法执行您想要的操作时,您需要一个自定义删除程序。考虑不同的场景:

    从池中获取内存,并使用“新放置”创建对象。在未使用
    new
    创建的对象上调用
    delete
    将是未定义的行为,因此您需要插入将使用适当内存池的删除程序。这适用于使用
    malloc
    获取并使用
    free
    释放的内存,例如,或任何其他类型的内存分配器。这也适用于从不同堆获取的内存


    该资源甚至不是内存,而是文件描述符、数据库连接等。当没有对该资源的引用时,删除程序需要释放该资源,但释放该资源并不涉及调用
    delete
    ,但是还有一些其他操作。

    并非所有内存都分配了
    新的
    ,内存不是唯一需要释放的资源,例如

    std::shared_ptr<FILE> open_file(const std::String& path, const std::String& mode)
    {
      if (FILE* f = :fopen(path.c_str(), mode.c_str()))
        return std::shared_ptr<FILE>(f, ::fclose);
      throw std::runtime_error("Cannot open file");
    }
    
    std::shared_ptr open_文件(const std::String&path,const std::String&mode)
    {
    if(FILE*f=:fopen(path.c_str(),mode.c_str())
    返回std::shared_ptr(f,::fclose);
    抛出std::runtime_错误(“无法打开文件”);
    }
    
    并非所有内存都分配了
    新的
    ,内存不是唯一需要释放的资源,例如

    std::shared_ptr<FILE> open_file(const std::String& path, const std::String& mode)
    {
      if (FILE* f = :fopen(path.c_str(), mode.c_str()))
        return std::shared_ptr<FILE>(f, ::fclose);
      throw std::runtime_error("Cannot open file");
    }
    
    std::shared_ptr open_文件(const std::String&path,const std::String&mode)
    {
    if(FILE*f=:fopen(path.c_str(),mode.c_str())
    返回std::shared_ptr(f,::fclose);
    抛出std::runtime_错误(“无法打开文件”);
    }
    
    它通常用于返回不透明指针或需要特殊删除函数的库,如
    Foo*CreateFoo()
    /
    void DeleteFoo(Foo*)
    。它通常用于返回不透明指针或需要特殊删除函数的库,如
    Foo*CreateFoo()
    /
    void DeleteFoo(Foo*)
    。对于不完整的类型,您不需要自定义删除程序来使用
    共享\u ptr
    ,只有在您首次初始化
    共享\u ptr
    时,该类型才需要完整(通常是这样,因为您当时刚刚分配了对象,所以类型必须完整)使用不完整类型的
    shared\u ptr
    时,不需要自定义删除程序,仅当您首次初始化
    shared\u ptr
    时,类型才需要完整(通常是这样,因为您刚刚在该点分配了对象,所以类型必须完整)