何时对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的方法代码>(如你所说)
当
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
时,类型才需要完整(通常是这样,因为您刚刚在该点分配了对象,所以类型必须完整)