首页 > TAG信息列表 > raii
Chapter 3
资源管理 条款 13 以对象管理资源 “以对象管理资源“”也被称为“资源取得时机便是初始化时机(RAII)”。 获得资源后立即放进管理对象内,即在构造函数中获取资源。 管理对象(managing object)运用析构函数确保资源被释放。 在C++11中,应该使用 shared_ptr 和 unique_ptr 来01 | C++ 资源管理:堆、栈、RAII
一、基本概念 堆(heap),在内存管理的语境下,指的是动态分配内存的区域,与数据结构里的堆不是一个概念。这里的内存,被分配之后需要手工释放,否则,就会造成内存泄漏。 C++ 标准里使用 new 和 delete 分配和释放内存的区域叫自由存储区(free store),这是堆的一个子集: new 和 delete 操作RAII 与 智能指针
小彭老师的课程 C++11 的 for each只要实现了begin()与end()是可以使用,也就是list也可以用,而for_each()函数 RAII 所谓的RAII,全称为Resource Acquisition Is Initialization,汉语是“资源获取即初始化”。但是这个直译并没有很好地解释这个词组的含义。其实含义并不高深复杂,简用C++ RAII思想写windows驱动
随着VS2017的普遍使用,C++驱动的编写已经不用完全使用C语言了, C语言时代,最难处理的是资源泄露,分配了的还要写代码进行回收 现在,有了C++,完全可以利用C++来提升代码质量 (1)首先我们应注意,C++隐藏了太多细节,这使得写驱动容易蓝屏 所以,用C++写驱动,一定要实现一个简化的C++运行环境 (2Resource acquisition is initialization (RAII)
Resource acquisition is initialization (RAII) is a programming idiom used in several object-oriented, statically-typed programming languages to describe a particular language behavior. (C 语言没有构造析构函数,就不能直接用RAII) In RAII, holding a resourcRust--如何实现内存安全的?
一、Rust的内存管理 采用虚拟内存空间在栈和堆上分配内存,这是诸多编程语言通用的内存管理基石,Rust也是一样。然而,与c/c++语言不同的是,Rust不需要开发者显式地通过malloc/new或free/delete之类的函数去分配和回收堆内存。 栈内存的生命周期是短暂的,会随着栈展开(如函数调用)的过程而__acrt_first_block == header 异常原因分析
问题描述最近在写dll动态库时,动态库函数返回的std::string对象在析构时抛出了异常: 为简化描述问题,测试代码如下(MSVC /MT 编译),就是返回一个简单的std::stringtools.h # if defined(_WIN32) && !defined(__CYGWIN__) # ifdef GFAUX_EXPORTS# define GAX_API __declspec115、使用智能指针管理内存资源,RAII是怎么回事?
1) RAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”,也就是说在构 造函数中申请分配资源,在析构函数中释放资源。 因为C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候会 自动调用析构函数。所以,在RAII的指导Effective C++ 详解条款14: 在资源管理类中小心coping行为
许多资源被动态分配于堆 heap 内而后被用于单一区块或函数内。它们应该在控制流离开那个区块或函数时被释放。标准程序库提供的auto_ptr 正是针对这种形势而设计的。 条款13就描述了auto_ptr和 tr1::shared_ptr 是如何将“资源取得时机便是初始化时机(Resource Acquisition IsC++核心准则NR.6:不要将所有清理操作放在函数最后并使用goto语句跳转
NR.6: Don't place all cleanup actions at the end of a function and goto exit NR.6:不要将所有清理操作放在函数最后并使用goto语句跳转 Reason(原因) goto is error-prone. This technique is a pre-exception technique for RAII-like resource and error handling. gotCppCon笔记--Back to Basics: RAII and the Rule of Zero
C++编程很多时候需要手动管理资源,其中包括资源的获取,使用和释放,而手动对资源释放是很容易出错的一个环节。 根据C++的特性,当局部对象的生命周期结束时,会调用析构函数,因此借由类的析构函数对资源进行释放就是RAII的工作原理。 但是这段代码仍然存在问题,如果对vector进行复制,此RAII---它的思想是以对象管理资源
RAII机制有助于解决这个问题,RAII(Resource acquisition is initialization,资源获取即初始化)。它的思想是以对象管理资源。为了更为方便、鲁棒地释放已获取的资源,避免资源死锁,一个办法是把资源数据用对象封装起来。程序发生异常,执行栈展开时,封装了资源的对象会被自动调用其析构函数异常情况下如何正确处置潜在的孤立类?
我最近刚开始在我们的一些项目中使用“代码分析”的完整规则集.确实使我对IDisposable类更加仔细考虑的警告之一是CA2000.我有很多警告它抱怨某些可丢弃的对象没有放置在每个异常路径上. 因此,问题是:在返回之前,在方法的其余部分出现异常的情况下,处理对象处置的更正确方法是什么?例c-如何在函数出口上运行清除代码?
C类提供RAII习惯用法.因此,您不必关心异常: void function() { // The memory will be freed automatically on function exit std::vector<int> vector(1000); // Do some work } 但是,如果(出于某些原因)必须使用某些纯C API,则必须围绕它创建C包装程序,或c – 使用RAII从C风格的API管理资源
Resource Acquisition is Initialization(RAII)通常用于管理资源的生命周期,这些资源在生命周期结束时需要某种方式的清理代码,从删除新指针到释放文件句柄. 如何快速轻松地使用RAII来管理从C风格API获取的资源的生命周期? 在我的情况下,我想使用RAII从C风格的API中自动执行清理函数c – “手柄”是否有适当的’包装所有权’?
Handles具有除指针之外的适当语义.所以对我来说这样的例子(摘自Rule of Zero): class module { public: explicit module(std::wstring const& name) : handle { ::LoadLibrary(name.c_str()), &::FreeLibrary } {} // other module related functions go here privac – 何时使用向量中的对象以及何时使用指向向量中对象的指针?
实例化对象并将其存储在向量中时. 这三者之间的利弊是什么?在哪种情况下应该使用这些利弊? 宾语: std::vector<obj> collection; collection.push_back(obj{}); 指向对象的指针: std::vector<obj*> collection; collection.push_back(new obj{}); 智能指针: std::vector<std::uniquC优化器删除具有副作用的对象
这当前不是问题,但我担心代码是否被移植或我们更改编译器. 我有一个块的代码 { MyClass myObj; // copy some other variables but never touch myObj . . } // expect destructor to be called on myObj 其中myObj从未在块代码中使用,但构造函数有副作用,我依赖于Mc – 依赖于Windows句柄的类型是指针吗?
Windows句柄有时很难记住清理后(使用创建的笔和笔刷进行GDI是一个很好的例子). RAII解决方案很棒,但是为每种不同类型的句柄制作一个完整的(五个规则)RAII类真的很棒吗?当然不是!我能看到的最好的是一个完整的通用RAII类,其他类只是定义在清理句柄时要做什么,以及其他特定于句柄的方c – 堆栈展开时使用RAII是否安全?
class AutoSomething { public: AutoSomething(Object& ob) : object_(object) {} ~AutoSomething() { object_.some_callback(); } private: Object& object_; }; ......... void Object::some_function() { AutoSoc – 对象的ctor和dtor必须在同一个线程上吗?
使用C RAII,当对象超出范围时,会调用dtor.多线程的机制总是涉及传递回调以在新线程上运行.因此,我认为对象不可能在一个线程中构造而在另一个线程中被破坏,因为那些对象必须是不同的范围. 我这是对的吗?或者是否存在可以在不同线程中调用对象ctor和dtor的情况?解决方法: Thus, I donEffective C++随笔 13 to 17 资源管理
资源管理并不单指内存,这里的资源包括内存、文件描述器、互斥锁、图形界面中的字形与笔刷、数据库连接、网络sockets等,其中最常用的是内存资源。 13.以对象管理资源 为防止资源泄露的一个简单方法是:使用RAII对象,(资源取得即初始化),通常在构造函数中分配资源,在析构函数中释放资c – 我应该删除.h文件中的char数组
如何在Test.h中管理char数组缓冲区? Test.h class Test{ public: Test(); ~Test(); char buffer[255]; }; Test.cc #include "Test.h" Test::Test() { } Test::~Test() { // Do I need to delete/free buffer? } 我知道当使用new或malloc时,必须使用delete或C和Qt:这是内存泄漏吗? (和一般问题)
在过去的两年里,我主要使用C进行编程(以前是一些Java),并决定使用Qt Creator和Qt库来学习C语言. 我的问题是以下代码是否引入了内存泄漏: // filename is a QStringListIterator // dir is a QDir while (filename.hasNext()) { QString came_from_file(dic – 如何将原始指针的矢量转换为唯一指针的矢量?
#include <vector> enum ListOfGameStates { // List of game states }; class GameState() { public: GameStates(); // Initializes protected (global) variables virtual ListOfGameStates run() = 0; protected: // Heavywe