Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      RAII

      From cppreference.com
      <cpp‎ |language
       
       
      C++ language
      General topics
      Flow control
      Conditional execution statements
      Iteration statements (loops)
      Jump statements
      Functions
      Function declaration
      Lambda function expression
      inline specifier
      Dynamic exception specifications(until C++17*)
      noexcept specifier(C++11)
      Exceptions
      Namespaces
      Types
      Specifiers
      constexpr(C++11)
      consteval(C++20)
      constinit(C++20)
      Storage duration specifiers
      Initialization
      Expressions
      Alternative representations
      Literals
      Boolean -Integer -Floating-point
      Character -String -nullptr(C++11)
      User-defined(C++11)
      Utilities
      Attributes(C++11)
      Types
      typedef declaration
      Type alias declaration(C++11)
      Casts
      Memory allocation
      Classes
      Class-specific function properties
      Special member functions
      Templates
      Miscellaneous
       

      Resource Acquisition Is Initialization or RAII, is a C++ programming technique[1][2] which binds the life cycle of a resource that must be acquired before use (allocated heap memory, thread of execution, open socket, open file, locked mutex, disk space, database connection—anything that exists in limited supply) to thelifetime of an object.

      RAII guarantees that the resource is available to any function that may access the object (resource availability is aclass invariant, eliminating redundant runtime tests). It also guarantees that all resources are released when the lifetime of their controlling object ends, in reverse order of acquisition. Likewise, if resource acquisition fails (the constructor exits with an exception), all resources acquired by every fully-constructed member and base subobject are released in reverse order of initialization. This leverages the core language features (object lifetime,scope exit,order of initialization andstack unwinding) to eliminate resource leaks and guarantee exception safety. Another name for this technique isScope-Bound Resource Management (SBRM), after the basic use case where the lifetime of an RAII object ends due to scope exit.

      RAII can be summarized as follows:

      • encapsulate each resource into a class, where
      • the constructor acquires the resource and establishes all class invariants or throws an exception if that cannot be done,
      • the destructor releases the resource and never throws exceptions;
      • always use the resource via an instance of a RAII-class that either
      • has automatic storage duration or temporary lifetime itself, or
      • has lifetime that is bounded by the lifetime of an automatic or temporary object.

      Move semantics enable the transfer of resources and ownership between objects, inside and outside containers, and across threads, while ensuring resource safety.

      (since C++11)

      Classes withopen()/close(),lock()/unlock(), orinit()/copyFrom()/destroy() member functions are typical examples of non-RAII classes:

      std::mutex m; void bad(){    m.lock();// acquire the mutex    f();// if f() throws an exception, the mutex is never releasedif(!everything_ok())return;// early return, the mutex is never released    m.unlock();// if bad() reaches this statement, the mutex is released} void good(){std::lock_guard<std::mutex> lk(m);// RAII class: mutex acquisition is initialization    f();// if f() throws an exception, the mutex is releasedif(!everything_ok())return;// early return, the mutex is released}// if good() returns normally, the mutex is released

      [edit]The standard library

      The C++ library classes that manage their own resources follow RAII:std::string,std::vector,std::jthread(since C++20), and many others acquire their resources in constructors (which throw exceptions on errors), release them in their destructors (which never throw), and don't require explicit cleanup.

      In addition, the standard library offers several RAII wrappers to manage user-provided resources:

      (since C++11)

      [edit]Notes

      RAII does not apply to the management of the resources that are not acquired before use: CPU time, core availability, cache capacity, entropy pool capacity, network bandwidth, electric power consumption, stack memory. For such resources, a C++ class constructor cannot guarantee resource availability for the duration of object lifetime, and other means of resource management have to be used.

      [edit]External links

      1. RAII in Stroustrup's C++ FAQ
      2. C++ Core Guidelines E.6 "Use RAII to prevent leaks"
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/language/raii&oldid=176747"

      [8]ページ先頭

      ©2009-2025 Movatter.jp