jjzjj

c++ - unique_ptr 删除器开销

在正常的C++设计中,大多数对象都可以通过delete删除。声明,free函数,或库特定的等效于free.对于此类对象,unique_ptrDeleter实现可以是通过空基类优化消除的无状态对象。但是,某些库需要使用另一个对象(可能包含函数指针或其他上下文)从该库中删除对象。typedefstructlib_objectlib_object;structlib_api{lib_object(*createInstance)();void(*freeInstance)(lib_object*o);};可以将其包装在unique_ptr中通过存储lib_api作为自定义数据成员的指针Del

c++ - 单元测试资源管理类中的私有(private)方法 (C++)

我之前用另一个名字问过这个问题,但因为我没有很好地解释它而删除了它。假设我有一个管理文件的类。假设此类将文件视为具有特定文件格式,并包含对该文件执行操作的方法:classFoo{std::wstringfileName_;public:Foo(conststd::wstring&fileName):fileName_(fileName){//ConstructaFoohere.};intgetChecksum(){//Openthefileandreadsomepartofit//Longmethodtofigureoutwhatchecksumitis.//Returnthechec

c++ - 堆栈分配的 RAII 对象与 DI 原则

在C++中,我经常使用RAII风格的对象来使代码更可靠,并将它们分配到堆栈上以提高代码的性能(并避免bad_alloc)。但是在堆栈上创建具体类的对象违反了依赖倒置(DI)原则并阻止模拟此对象。考虑以下代码:structIInputStream{virtualvectorread(size_tn)=0;};classConnection:publicIInputStream{public:Connection(stringaddress);virtualvectorread(size_tn)override;};structIBar{virtualvoidprocess(IInputS

c++ - 是否已经实现了任何 RAII 文件句柄?

RAII文件句柄看起来很基础,所以我猜它已经实现了?但是我找不到任何实现。我在boost::iostreams中找到了file_descriptor,但我不知道它是否是我要找的。 最佳答案 std::fstream支持RAII风格的用法-它们可以在构建时打开甚至测试,它们会在析构函数中自动刷新和关闭,但如果你可能会错过错误只是假设它有效,所以如果您需要稳健性,您可能想在代码中做一些更明确的事情。例如:if(std::ifstreaminput(filename))...useinput...elsestd::cerr如果你真的想使用

c++ - C++ 中的 goto 和 RAII

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Gotooutofablock:dodestructorsgetcalled?我知道C和C++中的goto运算符几乎在所有情况下都是无用的,但我想知道这个问题的答案只是出于兴趣,它没有实际意义。C++标准是否保证在这种情况下必须正确调用对象的析构函数?#includeclassFoo{public:Foo(){std::couthttp://liveworkspace.org/code/06031e6699c8fddda94b8594ccab1387那么goto和C++RAII的其他异常情况呢?如果您能在这里

C++ 使用 RAII 和抛出的析构函数

假设我有RAII类:classRaii{Raii(){};~Raii(){if()throwstd::exception();}};如果我有这个功能:voidfoo(){Raiiraii;if(something){throwstd::exception();}}这很糟糕,因为在清除第一个异常时我们可以再次抛出,这将终止进程。我的问题是-将raii用于清理可能抛出的代码的好的模式是什么?例如,这是好事还是坏事-为什么?classRaii{Raii(){};~Raii(){try{if()throwstd::exception();}catch(...){if(!std::uncaugh

c++ - 是否可以在不同的类中编写/包装异常处理组件(try、catch)?

这是关于将异常处理逻辑包装在某种类中。在写c++的时候代码,很多时候我们需要根据客户端抛出的异常捕获许多类型/变体。这导致我们在catch()子句中编写类似类型的代码(多次)。在下面的示例中,我编写了function(),它可以以多种可能的形式抛出异常。我想知道是否有可能以类的形式编写/包装这样的逻辑,以便最终用户必须一次编写类似类型的代码?有什么意义吗?#include#include#include#include//thisfunctioncanthrowstd::exception,std::string,intorunhandledvoidfunction(){std::ve

c++ - 让析构函数根据是否发生异常采取不同的操作

我有一些代码可以更新看起来像这样的数据库表try{db.execute("BEGIN");//LotsofDELETEandINSERTdb.execute("COMMIT");}catch(DBException&){db.execute("ROLLBACK");}我想将事务逻辑包装在RAII类中,这样我就可以编写{DBTransactiontrans(db);//LotsofDELETEandINSERT}但是我该如何为它编写析构函数呢? 最佳答案 使用以下内容:transactiontr(db);...tr.commit();

【C++干货铺】 RAII实现智能指针

=========================================================================个人主页点击直达:小白不是程序媛C++系列专栏:C++干货铺代码仓库:Gitee=========================================================================目录为什么需要智能指针?内存泄漏        什么是内存泄漏,内存泄露的危害内存泄漏的分类堆内存泄漏(Heapleak)系统资源泄露如何避免内存泄漏智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::

C++中的RAII机制及其智能指针的应用

一、引言C++是一种高效且功能强大的编程语言,但内存管理一直是其一大挑战。为了简化资源管理,C++引入了RAII(ResourceAcquisitionIsInitialization)机制。本文将深入探讨RAII的原理,并通过智能指针这一具体实现来展示RAII在现代C++编程中的应用。二、RAII机制概述RAII,即“资源获取即初始化”,是C++中的一个重要编程思想。其核心思想是:将资源的生命周期与对象的生命周期绑定,当对象创建时获取资源,对象销毁时自动释放资源。这样做的好处是,资源管理代码更加集中,可以有效防止资源泄露和程序异常。三、智能指针的实现与应用智能指针是RAII机制的一种典型应用