草庐IT

java - Java 中的 RAII... 资源处理总是那么难看吗?

我刚玩过Java文件系统API,得到了以下函数,用于复制二进制文件。原始来源来自网络,但我添加了try/catch/finally子句以确保,如果发生错误,缓冲流将在退出函数之前关闭(因此,我的操作系统资源被释放)。我精简了函数以显示模式:publicstaticvoidcopyFile(FileOutputStreamoDStream,FileInputStreamoSStream)throwetc...{BufferedInputStreamoSBuffer=newBufferedInputStream(oSStream,4096);BufferedOutputStreamoDBu

python - Python 中的 RAII : What's the point of __del__?

乍一看,Python的__del__特殊方法似乎提供了与C++中的析构函数相同的优势。但是根据Python文档(https://docs.python.org/3.4/reference/datamodel.html),不能保证您的对象的__del__方法会被调用!Itisnotguaranteedthat__del__()methodsarecalledforobjectsthatstillexistwhentheinterpreterexits.所以也就是说,方法没用!不是吗?可能会或可能不会被调用的Hook函数实际上并没有多大用处,因此__del__没有提供任何关于RAII的信息

c++ - RAII 套接字 : when to release (close)

我想在C套接字上编写一个简单的小型C++RAII包装器。问题是套接字在什么状态下被认为已初始化(从RAII的角度来看)并因此有资格发布。例如,对于TCP客户端套接字:如果socket调用成功,但connect调用失败,是否应该调用close?这只是一个例子,我对一般答案感兴趣,比如:socket成功创建的每个套接字都必须关闭。或必须为每个connect、listen或accept关闭。socket&friends和close的手册页不是很清楚(至少对我而言)。 最佳答案 套接字配对的两个部分是socket()和close()以及co

c++ - 使用 RAII 嵌套异常

所以在C++中使用std::nested_exception嵌套异常的方法是:voidfoo(){try{//codethatmightthrowstd::ifstreamfile("nonexistent.file");file.exceptions(std::ios_base::failbit);}catch(...){std::throw_with_nested(std::runtime_error("foofailed"));}}但是这种技术在希望嵌套异常的每一层都使用显式的try/catchblock,这至少可以说是丑陋的。RAII,JonKalbexpands作为“责任获取

c++ - 范围互斥锁的自定义 RAII C++ 实现

我不能使用boost或最新的std::thread库。要走的路是创建一个范围互斥体的自定义实现。一句话,当一个类实例被创建一个互斥锁。在类销毁时,互斥锁被解锁。任何可用的实现?我不想重新发明轮子。我需要使用pthreads。资源获取是初始化==“RAII” 最佳答案 NoteThisisanoldanswer.C++11containsbetterhelpersthataremoreplatformindependent:std::lock_guardstd::mutex,std::timed_mutex,std::recursiv

c++ - 进程 fork 后 RAII 对象会发生什么?

在Unix/Linux下,我的事件RAII对象在fork时会发生什么?会不会出现双删?复制构造和赋值是什么?如何确保没有坏事发生? 最佳答案 fork(2)创建进程的完整拷贝,包括其所有内存。是的,自动对象的析构函数将运行两次-在父进程和子进程中,在单独的虚拟内存空间中。没有什么“坏事”发生(当然,除非您在析构函数中从帐户中扣除了钱),您只需要了解这一事实。 关于c++-进程fork后RAII对象会发生什么?,我们在StackOverflow上找到一个类似的问题:

c++ - Intel 2015 编译器错误,RAII 破坏不正确,这是错误还是我做错了什么?

我有一个测试用例,其中我有一个包含3个子对象(A、B和C)的类,以及第二个子对象B在构造过程中抛出异常。据我了解C++,编译器应该倒回大类的构造并销毁第一个对象A,但不是第二个(B)或第三个(C)对象。我看到的是,如果我使用第一个对象的“类内初始化”A,然后代替第一个对象A被摧毁,第三个​​对象C被摧毁。当然,销毁尚未构建的对象是非常糟糕!例如,如果C是std:unique_ptr,它可能会在尝试释放垃圾指针时发出分段违规信号。如果我使用老派的“成员初始化”,那么这个问题就不会发生。我在gcc4.8中看不到这一点这是代码。类(class)D暴露了错误。类(class)E应该有相同的功能

c++ - 非指针上的 RAII 单线?

相关主题std::unique_ptr,deletersandtheWin32API要将Win32句柄用作RAII,我可以使用以下行std::unique_ptr::type,decltype(&CloseHandle)>m_mutex(CreateMutex(NULL,FALSE,NULL),&::CloseHandle);对我来说,这是一个干净的单线,完全符合我的要求。当涉及到SOCKET时,由于SOCKET不能为nullptr,因此它不会使用同一行编译。我需要做的事情如下:structSocketDeleter{typedefSOCKETpointer;voidoperator(

c++ - RAII 什么时候比 GC 更有优势?

考虑这个在C++中演示RAII的简单类(从我的脑海中):classX{public:X(){fp=fopen("whatever","r");if(fp==NULL)throwsome_exception();}~X(){if(fclose(fp)!=0){//Anerror.Nowwhat?}}private:FILE*fp;X(Xconst&)=delete;X(X&&)=delete;X&operator=(Xconst&)=delete;X&operator=(X&&)=delete;}我不能在析构函数中抛出异常。我有一个错误,但没有办法报告它。这个例子非常通用:我不仅可以使用

C++ RAII 不工作?

我刚刚开始使用C++中的RAII并设置了一个小测试用例。要么我的代码很困惑,要么RAII不工作!(我猜是前者)。如果我跑:#include#includeclassA{public:A(inti){i_=i;std::cout除了注释掉的异常(exception),我得到:A1constructedA2constructedA2destructedA1destructed正如预期的那样,但我得到的异常(exception)是:A1constructedA2constructedterminatecalledafterthrowinganinstanceof'std::exception