raii相关内容

CUDA:在C ++中包装设备内存分配

我现在开始使用CUDA,不得不承认我对C API有点失望。我理解选择C的原因,但是语言是基于C ++,而是几个方面会更简单。设备内存分配(通过 cudaMalloc )。 我的计划是自己做,使用重载的 new 和RAII(两个备选)的新操作符 c $ c。我想知道是否有任何警告,我还没有注意到目前为止。代码似乎可以工作,但我仍然想知道潜在的内存泄漏。 RAII 代码如下: Cu ..
发布时间:2016-10-22 18:09:10 C/C++开发

你可以使用shared_ptr用于C风格数组的RAII吗?

我正在处理一段代码,它有许多可能的失败点,导致它提前退出该函数。我要交互的库需要将C风格的数组传递给函数。所以,不是在每个退出点调用数组上的删除,我这样做: void SomeFunction(int arrayLength) { shared_ptr raiiArray(new char [arrayLength]); pArray = raiiArray.get ..
发布时间:2016-10-22 17:39:19 C/C++开发

为什么RAII可用时进行垃圾收集?

我听到C ++ 14在C ++标准库中引入一个垃圾回收器的演讲。 此功能的基本原理是什么?这不是RAII存在于C ++的原因吗? 标准库垃圾回收器的存在将如何影响RAII语义? 对我(程序员)或编写C ++程序的方式有何影响? 解决方案 垃圾收集和RAII在不同的上下文中非常有用。 GC的存在不应影响您对RAII的使用。由于RAII是众所周知的,我给两个例子,GC是方便的。 ..
发布时间:2016-10-22 17:37:29 C/C++开发

RAII与异常

我们在C ++中使用RAII的越多,我们越发现自己使用析构函数来做非平凡的释放。现在,释放(完成,但是你想调用它)可能会失败,在这种情况下,异常真的是让楼上的任何人知道我们的释放问题的唯一方法。但是再次,抛出 - 析构器是一个坏主意,因为在堆栈解开期间抛出异常的可能性。 std :: uncaught_exception()让你知道什么时候发生,但没有更多,因为除了让你记录一个消息之前终止你没有太 ..
发布时间:2016-10-22 17:07:12 C/C++开发

使用静态自定义删除程序类型化一个shared_ptr类型,类似于unique_ptr

我已阅读关于 shared_ptr 和 unique_ptr 的自定义删除程序的许多问题,二。但是,我还没有找到任何明确的答案这个问题: 如何创建一个类型作为一个 shared_ptr 使用自定义删除程序,类似于 unique_ptr 将删除程序作为类型定义的一部分? 对于 unique_ptr 使用,我使用一个deleter类,处理删除单个类型(为了简洁,它只限于两种类型): ..
发布时间:2016-10-20 23:42:24 C/C++开发

除了C ++,其他语言的程序员是否使用,知道或理解RAII?

$ b 所以我真的很好奇,如果这是因为我每天被硬核C ++程序员包围,RAII只是不是一般知名的(包括C + +),或者如果所有这些问题在Stackoverflow是由于我现在接触的程序员不是与C ++成长,在其他语言的人只是不使用/知道RAII? 对于在这个线程中评论RAII(资源获取是初始化)的人来说,这是一个激励的例子。 p> class StdioFile { FILE * fi ..
发布时间:2016-10-16 14:26:15 C/C++开发

触发异常时应该如何记录日志?

在我最近写的程序中,当我的“业务逻辑”代码在第三方或项目API中触发异常时,我想记录日志。 (为了澄清,我想记录当使用一个API引起一个异常,这可以是许多框架高于实际 throw ,并且可能会在实际 catch (其中可以记录异常有效负载。)我做了以下操作: void former_function() { / *这里的一些代码* / try { / *我知道的一些特定代码可 ..
发布时间:2016-10-14 21:42:10 C/C++开发

做增强asio套接字有正确的RAII清理

我尝试通过源代码,但我不能导航那么多的模板代码。 基本上:这是文档说的( close()): 注释 对于关于连接套接字的优雅 的可移植行为,在关闭套接字之前调用shutdown()。 我可以手动进行,但如果可能, 所以如果我有socket超出范围,我需要调用 shutdown()和 close()上,还是会自动完成? 解决方案 可以依赖套接字使 ..
发布时间:2016-10-14 21:13:13 C/C++开发

C ++中的什么包装类应该用于自动化资源管理?

我是一个C ++业余爱好者。我写一些Win32 API代码,有句柄和奇怪的复合分配对象aplenty。所以我想知道 - 是否有一些包装类可以使资源管理更容易? 例如,当我想加载一些数据时,我打开一个文件 CreateFile()并获取 HANDLE 。当我完成它,我应该调用 CloseHandle()就可以了。但是对于任何合理复杂的加载函数,将会有几十个可能的退出点,更不用说异常。 所 ..
发布时间:2016-10-14 20:12:31 C/C++开发

在构造函数中创建的模式名称,在析构函数中删除(C ++)

传统上,在C ++中,您可以在构造函数中创建任何依赖关系,并在析构函数中删除它们。 b $ b { public: A(){m_b = new B(); } 〜A(){delete m_b; } private: B * m_b; }; 这种资源获取技术/模式是否有一个通用名称? 我确定我已经读过它,但现在找不到了。 编辑: 正如许多人指出 ..
发布时间:2016-10-14 19:50:28 C/C++开发

RAII教程C ++

我想学习如何在c ++中使用RAII。我想我知道它是什么,但不知道如何在我的程序中实现它。 有没有任何一个链接可以告诉我RAII? 解决方案 没有什么(就是说,我不认为你需要一个完整的教程)。 “ 换句话说: 指针应该被封装在智能指针类中(参见std :: auto_ptr,boost :: shared_ptr和boost :: scoped_ptr)。 需 ..
发布时间:2016-10-14 11:43:14 C/C++开发

局部变量范围问题

为什么以下代码打印“xxY”?局部变量应该不在整个函数的范围内吗?我可以使用这样的行为,或者这将在未来的C ++标准中改变? 我认为根据C ++标准3.3.2“ “ c $ c> #include using namespace std; class MyClass { public: MyClass(int){cout ..
发布时间:2016-10-14 11:19:39 C/C++开发

ScopeGuard使用真的导致更好的代码吗?

我遇到了Andrei Alexandrescu和Petru Marginean多年前撰写的这篇文章,其中介绍和讨论了一个实用程序类称为ScopeGuard用于编写异常安全代码。我想知道如果编码与这些对象真正导致更好的代码或如果它混淆错误处理,也许守卫的回调将更好地呈现在catch块中?有没有人在实际生产代码中使用这些代码? 解决方案 你的初步构成的声明,它是晦涩的和代码将是一个 catch ..
发布时间:2016-10-13 10:56:05 C/C++开发

C / C ++宏/模板blackmagic生成唯一的名称

宏很好。 模板很好。 几乎任何工作都很好。 例子是OpenGL;但是技术是C ++特定的并且依赖于没有OpenGL的知识。 精确的问题: 表达式E;其中我不必指定唯一的名称;使得构造函数被调用,其中E被定义,并且调用析构函数,其中块E在结束。 例如,考虑: class GlTranslate { GLTranslate(float x,float y,floa ..
发布时间:2016-10-11 22:52:39 C/C++开发

我需要手动关闭ifstream吗?

当我使用 std :: ifstream ?时,我需要手动调用 close()吗? > 例如,在代码中: std :: string readContentsOfFile :: string fileName){ std :: ifstream file(fileName.c_str()); if(file.good()){ std :: stringstream b ..
发布时间:2016-10-11 21:27:51 C/C++开发

理解术语的含义和概念 - RAII(资源获取是初始化)

您能C ++开发人员给我们一个很好的描述RAII是什么,为什么它很重要,以及它是否可能与其他语言有什么关系? 我做知道一点。我相信它代表“资源获取是初始化”。然而,这个名字不与我的(可能不正确)理解RAII是什么:我得到的印象是RAII是一种初始化堆栈上的对象的方式,这样当这些变量超出范围,析构函数将自动 那么为什么不叫“使用堆栈触发清理”(UTSTTC :)?你如何从那里到“RAII ..
发布时间:2016-10-11 20:14:14 C/C++开发