首页 > 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++运行环境 (2

Resource 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 resourc

Rust--如何实现内存安全的?

一、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 __declspec

115、使用智能指针管理内存资源,RAII是怎么回事?

1) RAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”,也就是说在构 造函数中申请分配资源,在析构函数中释放资源。 因为C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候会 自动调用析构函数。所以,在RAII的指导

Effective C++ 详解条款14: 在资源管理类中小心coping行为

许多资源被动态分配于堆 heap 内而后被用于单一区块或函数内。它们应该在控制流离开那个区块或函数时被释放。标准程序库提供的auto_ptr 正是针对这种形势而设计的。 条款13就描述了auto_ptr和 tr1::shared_ptr 是如何将“资源取得时机便是初始化时机(Resource Acquisition Is

C++核心准则​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. got

CppCon笔记--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 priva

c – 何时使用向量中的对象以及何时使用指向向量中对象的指针?

实例化对象并将其存储在向量中时. 这三者之间的利弊是什么?在哪种情况下应该使用这些利弊? 宾语: std::vector<obj> collection; collection.push_back(obj{}); 指向对象的指针: std::vector<obj*> collection; collection.push_back(new obj{}); 智能指针: std::vector<std::uniqu

C优化器删除具有副作用的对象

这当前不是问题,但我担心代码是否被移植或我们更改编译器. 我有一个块的代码 { MyClass myObj; // copy some other variables but never touch myObj . . } // expect destructor to be called on myObj 其中myObj从未在块代码中使用,但构造函数有副作用,我依赖于M

c – 依赖于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() { AutoSo

c – 对象的ctor和dtor必须在同一个线程上吗?

使用C RAII,当对象超出范围时,会调用dtor.多线程的机制总是涉及传递回调以在新线程上运行.因此,我认为对象不可能在一个线程中构造而在另一个线程中被破坏,因为那些对象必须是不同的范围. 我这是对的吗?或者是否存在可以在不同线程中调用对象ctor和dtor的情况?解决方法: Thus, I don

Effective 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(di

c – 如何将原始指针的矢量转换为唯一指针的矢量?

#include <vector> enum ListOfGameStates { // List of game states }; class GameState() { public: GameStates(); // Initializes protected (global) variables virtual ListOfGameStates run() = 0; protected: // Heavywe