草庐IT

php - PHP 是否支持 RAII 模式?如何?

大多数关于PHP的资源从不涉及内存管理,因为该语言本身非常擅长为您做这件事。然而,在PHP中,您通常最终会处理非内存的外部资源——数据库句柄、session、数据库事务等。这些外部资源可以使用某种形式的RAII对象进行最干净的管理。我最初以为PHP使用了类似于JVM或CLR的垃圾回收方案,其中不存在析构函数的概念。(记住:Everyonethinksaboutgarbagecollectionthewrongway--终结器不是析构器!)有特殊的__destruct方法,但我认为它是类似于Java或C#终结器的“终结器”。出于这个原因,您不能在JVM或CLR上使用RAII(C#的usi

c++ - 构造函数中的 RAII 和异常

想象一下,我有一份工作要做,可以通过三种不同的方式完成:缓慢而痛苦,但故障安全的方式;给定你有Resource1的中度痛苦方式;一种快速简便的方法,需要Resource1和Resource2。现在,这些资源很宝贵,所以我将它们包装到RAII实现ResNHolder中并编写如下内容:voidDoTheJob(Logger&log/*,someotherparams*/){try{Res1Holderr1(/*argumentsforcreatingresource#1*/);try{Res2Holderr2(/*arguments*/);DoTheJobQuicklyAndEasily(

c++ - boost asio 套接字是否有适当的 RAII 清理

我尝试查看源代码,但无法浏览那么多模板代码。基本上:这是文档所说的(对于close()):RemarksForportablebehaviourwithrespecttogracefulclosureofaconnectedsocket,callshutdown()beforeclosingthesocket.我可以手动完成,但如果可能的话,依靠RAII会更好。因此,如果套接字超出范围,我是否需要对其调用shutdown()和close(),或者它会自动完成? 最佳答案 可以依靠套接字使用RAII执行适当的清理。当一个IO对象,比如

c++ - RAII、unique_ptr 和输出参数

我是一名尝试学习C++11的C#开发人员。我正在尝试使用windns.h查询DNS。我从DnsQuery()开始,读到我需要使用DnsRecordListFree()释放结果记录输出参数。C#方法可能是使用try-finallyblock来确保我无论如何都释放资源。但我了解到没有finallyblock,并且windns.h确实应该与时俱进并实现RAII兼容接口(interface)(据我了解典型的建议)。我没有等待它发生,而是尝试制作一个RAII包装器类,其析构函数调用DnsRecordListFree()并使用运算符重载转换来获取原始指针。但我对如何正确使用此句柄或指针来获取输出参

c++ - 如何将 C API 封装到 RAII C++ 类中?

给定一个库控制session的CAPI,将CAPI封装到RAIIC++类中的最佳设计是什么?CAPI看起来像:HANDLEOpenSession(STRINGsessionID);voidCloseSession(HANDLEhSession);HANDLEOpenItem(HANDLEhSession,STRINGitemID);voidCloseItem(HANDLEhItem);加上对其中一种类型(Session或Item)有用的其他函数,并直接映射到相关对象的C++成员函数。但这里不需要它们。我的主要兴趣是构建和销毁这些对象,使用RAII来管理这些类的正确打开和关闭。我设计类(

c++ - SBRM/RAII 用于 std::va_list/va_start()/va_end 使用

我的代码包含如下片段:std::va_listap;va_start(ap,msgfmt);snprintf_bufbuf;consttchar*msg=buf.print_va_list(msgfmt,ap);va_end(ap);它们很短,va_start()和va_end()靠得很近,所以它们不是什么大问题。两者之间的调用异常可能是一个问题(或不是?)。简单测试表明,不允许从没有省略号的函数中调用va_start()。从与va_start()不同的函数调用va_end()是否允许?基本上,我很好奇是否可以对这些调用使用SBRM/RAII习惯用法,即使必须手动调用va_start(

c++ - 用于函数对和模板特化的 RAII 包装器

我已经为初始化和释放资源的C函数对编写了一个RAII包装器,它在大多数情况下都很适合我。#include#include#include#includetemplateclassRAIIWrapper{public:templateRAIIWrapper(InitFuncTypeinitializer,UninitFuncTypeuninitializer,conststd::string&errorString,constArgs&...args):uninit_func(uninitializer){if(successValue!=initializer(args...))thr

c++ - RAII 类的通用命名约定是什么?

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。在C++中,当使用资源获取即初始化(RAII)模式时,是否有任何通用的类命名约定?在我的例子中,我有一些类可以执行以下类型的操作,我希望这些名称对第一次阅读的读者在堆栈中看到其中一个时可能会产生有用的含义:一个抑制日志记录的类(可以嵌套)。放置观察者的类。一个类,用于记录当前线程正在处理的当前对象。除了基类行为(在前一行)之外,派生类还处理对象。作为第一

c++ - RAII 资源处理

我有一个RAII类:templateclassRAII{public:explicitRAII(T*p=0):p_(p){}~RAII(){deletep_;}T&operator*()const{returnp_;}T*operator‐>()const{returnp_;}};{RAII>r(newstd::vector());std::coutsize()isautomaticallydeallocated我知道当我用完范围时,我的析构函数将被调用。~RAII(){删除P_};我的问题是:它如何调用我的析构函数? 最佳答案 当

c++ - 这个 RAII 风格的 Objective-C 类可以工作吗?

在C++下,我有一个Mutex类,我使用这个RAII风格的类来确保互斥锁被解锁,无论方法返回的原因是什么:classMutexLock{protected:Mutex&m_mutex;public:MutexLock(Mutex&mutex):m_mutex(mutex){m_mutex.lock();}~MutexLock(){m_mutex.unlock();}};有什么理由,在使用ARC时,等效的Objective-C类不能正常工作:@interfaceLocker:NSObject{NSLock*_lock;}-(void)setLock:(NSLock*)lock;@end@