fbpx
Wikipedia

Smart pointer

In computer science, a smart pointer is an abstract data type that simulates a pointer while providing added features, such as automatic memory management or bounds checking. Such features are intended to reduce bugs caused by the misuse of pointers, while retaining efficiency. Smart pointers typically keep track of the memory they point to, and may also be used to manage other resources, such as network connections and file handles. Smart pointers were first popularized in the programming language C++ during the first half of the 1990s as rebuttal to criticisms of C++'s lack of automatic garbage collection.[1][2]

Pointer misuse can be a major source of bugs. Smart pointers prevent most situations of memory leaks by making the memory deallocation automatic. More generally, they make object destruction automatic: an object controlled by a smart pointer is automatically destroyed (finalized and then deallocated) when the last (or only) owner of an object is destroyed, for example because the owner is a local variable, and execution leaves the variable's scope. Smart pointers also eliminate dangling pointers by postponing destruction until an object is no longer in use.

If a language supports automatic garbage collection (for example, Java or C#), then smart pointers are unneeded for reclaiming and safety aspects of memory management, yet are useful for other purposes, such as cache data structure residence management and resource management of objects such as file handles or network sockets.

Several types of smart pointers exist. Some work with reference counting, others by assigning ownership of an object to one pointer.

History edit

Even though C++ popularized the concept of smart pointers, especially the reference-counted variety,[3] the immediate predecessor of one of the languages that inspired C++'s design had reference-counted references built into the language. C++ was inspired in part by Simula67.[4] Simula67's ancestor was Simula I. Insofar as Simula I's element is analogous to C++'s pointer without null, and insofar as Simula I's process with a dummy-statement as its activity body is analogous to C++'s struct (which itself is analogous to C. A. R. Hoare's record in then-contemporary 1960s work), Simula I had reference counted elements (i.e., pointer-expressions that house indirection) to processes (i.e., records) no later than September 1965, as shown in the quoted paragraphs below.[5]

Processes can be referenced individually. Physically, a process reference is a pointer to an area of memory containing the data local to the process and some additional information defining its current state of execution. However, for reasons stated in the Section 2.2 process references are always indirect, through items called elements. Formally a reference to a process is the value of an expression of type element.

element values can be stored and retrieved by assignments and references to element variables and by other means.
The language contains a mechanism for making the attributes of a process accessible from the outside, i.e., from within other processes. This is called remote access- ing. A process is thus a referenceable data structure.

It is worth noticing the similarity between a process whose activity body is a dummy statement, and the record concept recently proposed by C. A. R. Hoare and N. Wirth

Because C++ borrowed Simula's approach to memory allocation—the new keyword when allocating a process/record to obtain a fresh element to that process/record—it is not surprising that C++ eventually resurrected Simula's reference-counted smart-pointer mechanism within element as well.

Features edit

In C++, a smart pointer is implemented as a template class that mimics, by means of operator overloading, the behaviors of a traditional (raw) pointer, (e.g. dereferencing, assignment) while providing additional memory management features.

Smart pointers can facilitate intentional programming by expressing, in the type, how the memory of the referent of the pointer will be managed. For example, if a C++ function returns a pointer, there is no way to know whether the caller should delete the memory of the referent when the caller is finished with the information.

SomeType* AmbiguousFunction(); // What should be done with the result? 

Traditionally, naming conventions have been used to resolve the ambiguity,[6] which is an error-prone, labor-intensive approach. C++11 introduced a way to ensure correct memory management in this case by declaring the function to return a unique_ptr,

std::unique_ptr<SomeType> ObviousFunction(); 

The declaration of the function return type as a unique_ptr makes explicit the fact that the caller takes ownership of the result, and the C++ runtime ensures that the memory will be reclaimed automatically. Before C++11, unique_ptr can be replaced with auto_ptr, which is now deprecated.

Creating new objects edit

To ease the allocation of a

std::shared_ptr<SomeType> 

C++11 introduced:

auto s = std::make_shared<SomeType>(constructor, parameters, here); 

and similarly

std::unique_ptr<some_type> 

Since C++14 one can use:

auto u = std::make_unique<SomeType>(constructor, parameters, here); 

It is preferred, in almost all circumstances, to use these facilities over the new keyword.[7]

unique_ptr edit

C++11 introduces std::unique_ptr, defined in the header <memory>.[8]

A unique_ptr is a container for a raw pointer, which the unique_ptr is said to own. A unique_ptr explicitly prevents copying of its contained pointer (as would happen with normal assignment), but the std::move function can be used to transfer ownership of the contained pointer to another unique_ptr. A unique_ptr cannot be copied because its copy constructor and assignment operators are explicitly deleted.

std::unique_ptr<int> p1(new int(5)); std::unique_ptr<int> p2 = p1; // Compile error. std::unique_ptr<int> p3 = std::move(p1); // Transfers ownership. p3 now owns the memory and p1 is set to nullptr. p3.reset(); // Deletes the memory. p1.reset(); // Does nothing. 

std::auto_ptr is deprecated under C++11 and completely removed from C++17. The copy constructor and assignment operators of auto_ptr do not actually copy the stored pointer. Instead, they transfer it, leaving the prior auto_ptr object empty. This was one way to implement strict ownership, so that only one auto_ptr object can own the pointer at any given time. This means that auto_ptr should not be used where copy semantics are needed.[9][citation needed] Since auto_ptr already existed with its copy semantics, it could not be upgraded to be a move-only pointer without breaking backward compatibility with existing code.

shared_ptr and weak_ptr edit

C++11 introduces std::shared_ptr and std::weak_ptr, defined in the header <memory>.[8] C++11 also introduces std::make_shared (std::make_unique was introduced in C++14) to safely allocate dynamic memory in the RAII paradigm.[10]

A shared_ptr is a container for a raw pointer. It maintains reference counting ownership of its contained pointer in cooperation with all copies of the shared_ptr. An object referenced by the contained raw pointer will be destroyed when and only when all copies of the shared_ptr have been destroyed.

std::shared_ptr<int> p0(new int(5)); // Valid, allocates 1 integer and initialize it with value 5. std::shared_ptr<int[]> p1(new int[5]); // Valid, allocates 5 integers. std::shared_ptr<int[]> p2 = p1; // Both now own the memory. p1.reset(); // Memory still exists, due to p2. p2.reset(); // Frees the memory, since no one else owns the memory. 

A weak_ptr is a container for a raw pointer. It is created as a copy of a shared_ptr. The existence or destruction of weak_ptr copies of a shared_ptr have no effect on the shared_ptr or its other copies. After all copies of a shared_ptr have been destroyed, all weak_ptr copies become empty.

std::shared_ptr<int> p1 = std::make_shared<int>(5); std::weak_ptr<int> wp1 {p1}; // p1 owns the memory. {  std::shared_ptr<int> p2 = wp1.lock(); // Now p1 and p2 own the memory.  // p2 is initialized from a weak pointer, so you have to check if the  // memory still exists!  if (p2) {  DoSomethingWith(p2);  } } // p2 is destroyed. Memory is owned by p1. p1.reset(); // Free the memory. std::shared_ptr<int> p3 = wp1.lock();  // Memory is gone, so we get an empty shared_ptr. if (p3) { // code will not execute  ActionThatNeedsALivePointer(p3); } 

Because the implementation of shared_ptr uses reference counting, circular references are potentially a problem. A circular shared_ptr chain can be broken by changing the code so that one of the references is a weak_ptr.

Multiple threads can safely simultaneously access different shared_ptr and weak_ptr objects that point to the same object.[11]

The referenced object must be protected separately to ensure thread safety.

shared_ptr and weak_ptr are based on versions used by the Boost libraries.[citation needed] C++ Technical Report 1 (TR1) first introduced them to the standard, as general utilities, but C++11 adds more functions, in line with the Boost version.

Other types of smart pointers edit

There are other types of smart pointers (which are not in the C++ standard) implemented on popular C++ libraries or custom STL, some examples include hazard pointer[12] and intrusive pointer.[13] [14]

See also edit

References edit

  1. ^ Kline, Marshall (September 1997). "C++ FAQs Lite's sections on reference-counted smart pointers and copy-on-write reference semantics in the freestore management FAQs". cis.usouthal.edu. Retrieved 2018-04-06.
  2. ^ Colvin, Gregory (1994). "proposal to standardize counted_ptr in the C++ standard library" (PDF). open-std.org. Retrieved 2018-04-06.
  3. ^ Klabnik, Steve; Nichols, Carol (2023) [2018]. "15. Smart Pointers". The Rust Programming Language (2 ed.). San Francisco, California, USA: No Starch Press, Inc. pp. 315–351. ISBN 978-1-7185-0310-6. (xxix+1+527+3 pages)
  4. ^ Stroustrup, Bjarne. "A history of C++: 1979–1991" (PDF). Retrieved 2018-04-06.
  5. ^ Dahl, Ole-Johan; Nygaard, Kristen (September 1966). "SIMULA—An ALGOL-based simulation language" (PDF). folk.uio.no. Retrieved 2018-04-06.
  6. ^ "Taligent's Guide to Designing Programs, section Use special names for copy, create, and adopt routines".
  7. ^ Sutter, Herb (2013-04-20). "Trip Report: ISO C++ Spring 2013 Meeting". isocpp.org. Retrieved 2013-06-14.
  8. ^ a b ISO 14882:2011 20.7.1
  9. ^ CERT C++ Secure Coding Standard
  10. ^ ISO 14882:2014 20.7.1
  11. ^ "boost::shared_ptr thread safety". (NB. Does not formally cover std::shared_ptr, but is believed to have the same threading limitations.)
  12. ^ "folly/Hazptr.h at main · facebook/folly". github.com.
  13. ^ "Boost.SmartPtr: The Smart Pointer Library - 1.81.0". boost.org.
  14. ^ "EASTL/intrusive_ptr.h at master · electronicarts/EASTL". github.com.

Further reading edit

External links edit

  • countptr.hpp. The C++ Standard Library - A Tutorial and Reference by Nicolai M. Josuttis
  • Boost Smart Pointers
  • Smart Pointers in Delphi
  • Smart Pointers in Rust
  • Smart Pointers in Modern C++

smart, pointer, this, article, needs, additional, citations, verification, please, help, improve, this, article, adding, citations, reliable, sources, unsourced, material, challenged, removed, find, sources, news, newspapers, books, scholar, jstor, june, 2015,. This article needs additional citations for verification Please help improve this article by adding citations to reliable sources Unsourced material may be challenged and removed Find sources Smart pointer news newspapers books scholar JSTOR June 2015 Learn how and when to remove this template message In computer science a smart pointer is an abstract data type that simulates a pointer while providing added features such as automatic memory management or bounds checking Such features are intended to reduce bugs caused by the misuse of pointers while retaining efficiency Smart pointers typically keep track of the memory they point to and may also be used to manage other resources such as network connections and file handles Smart pointers were first popularized in the programming language C during the first half of the 1990s as rebuttal to criticisms of C s lack of automatic garbage collection 1 2 Pointer misuse can be a major source of bugs Smart pointers prevent most situations of memory leaks by making the memory deallocation automatic More generally they make object destruction automatic an object controlled by a smart pointer is automatically destroyed finalized and then deallocated when the last or only owner of an object is destroyed for example because the owner is a local variable and execution leaves the variable s scope Smart pointers also eliminate dangling pointers by postponing destruction until an object is no longer in use If a language supports automatic garbage collection for example Java or C then smart pointers are unneeded for reclaiming and safety aspects of memory management yet are useful for other purposes such as cache data structure residence management and resource management of objects such as file handles or network sockets Several types of smart pointers exist Some work with reference counting others by assigning ownership of an object to one pointer Contents 1 History 2 Features 3 Creating new objects 4 unique ptr 5 shared ptr and weak ptr 6 Other types of smart pointers 7 See also 8 References 9 Further reading 10 External linksHistory editEven though C popularized the concept of smart pointers especially the reference counted variety 3 the immediate predecessor of one of the languages that inspired C s design had reference counted references built into the language C was inspired in part by Simula67 4 Simula67 s ancestor was Simula I Insofar as Simula I s element is analogous to C s pointer without null and insofar as Simula I s process with a dummy statement as its activity body is analogous to C s struct which itself is analogous to C A R Hoare s record in then contemporary 1960s work Simula I had reference counted elements i e pointer expressions that house indirection to processes i e records no later than September 1965 as shown in the quoted paragraphs below 5 Processes can be referenced individually Physically a process reference is a pointer to an area of memory containing the data local to the process and some additional information defining its current state of execution However for reasons stated in the Section 2 2 process references are always indirect through items called elements Formally a reference to a process is the value of an expression of type element element values can be stored and retrieved by assignments and references to element variables and by other means The language contains a mechanism for making the attributes of a process accessible from the outside i e from within other processes This is called remote access ing A process is thus a referenceable data structure It is worth noticing the similarity between a process whose activity body is a dummy statement and the record concept recently proposed by C A R Hoare and N Wirth Because C borrowed Simula s approach to memory allocation the new keyword when allocating a process record to obtain a fresh element to that process record it is not surprising that C eventually resurrected Simula s reference counted smart pointer mechanism within element as well Features editIn C a smart pointer is implemented as a template class that mimics by means of operator overloading the behaviors of a traditional raw pointer e g dereferencing assignment while providing additional memory management features Smart pointers can facilitate intentional programming by expressing in the type how the memory of the referent of the pointer will be managed For example if a C function returns a pointer there is no way to know whether the caller should delete the memory of the referent when the caller is finished with the information SomeType AmbiguousFunction What should be done with the result Traditionally naming conventions have been used to resolve the ambiguity 6 which is an error prone labor intensive approach C 11 introduced a way to ensure correct memory management in this case by declaring the function to return a unique ptr std unique ptr lt SomeType gt ObviousFunction The declaration of the function return type as a unique ptr makes explicit the fact that the caller takes ownership of the result and the C runtime ensures that the memory will be reclaimed automatically Before C 11 unique ptr can be replaced with auto ptr which is now deprecated Creating new objects editTo ease the allocation of astd shared ptr lt SomeType gt C 11 introduced auto s std make shared lt SomeType gt constructor parameters here and similarlystd unique ptr lt some type gt Since C 14 one can use auto u std make unique lt SomeType gt constructor parameters here It is preferred in almost all circumstances to use these facilities over the new keyword 7 unique ptr editC 11 introduces std unique ptr defined in the header lt memory gt 8 A unique ptr is a container for a raw pointer which the unique ptr is said to own A unique ptr explicitly prevents copying of its contained pointer as would happen with normal assignment but the std move function can be used to transfer ownership of the contained pointer to another unique ptr A unique ptr cannot be copied because its copy constructor and assignment operators are explicitly deleted std unique ptr lt int gt p1 new int 5 std unique ptr lt int gt p2 p1 Compile error std unique ptr lt int gt p3 std move p1 Transfers ownership p3 now owns the memory and p1 is set to nullptr p3 reset Deletes the memory p1 reset Does nothing std a href Auto ptr html title Auto ptr auto ptr a is deprecated under C 11 and completely removed from C 17 The copy constructor and assignment operators of auto ptr do not actually copy the stored pointer Instead they transfer it leaving the prior auto ptr object empty This was one way to implement strict ownership so that only one auto ptr object can own the pointer at any given time This means that auto ptr should not be used where copy semantics are needed 9 citation needed Since auto ptr already existed with its copy semantics it could not be upgraded to be a move only pointer without breaking backward compatibility with existing code shared ptr and weak ptr editC 11 introduces std shared ptr and std weak ptr defined in the header lt memory gt 8 C 11 also introduces std make shared std make unique was introduced in C 14 to safely allocate dynamic memory in the RAII paradigm 10 A shared ptr is a container for a raw pointer It maintains reference counting ownership of its contained pointer in cooperation with all copies of the shared ptr An object referenced by the contained raw pointer will be destroyed when and only when all copies of the shared ptr have been destroyed std shared ptr lt int gt p0 new int 5 Valid allocates 1 integer and initialize it with value 5 std shared ptr lt int gt p1 new int 5 Valid allocates 5 integers std shared ptr lt int gt p2 p1 Both now own the memory p1 reset Memory still exists due to p2 p2 reset Frees the memory since no one else owns the memory A weak ptr is a container for a raw pointer It is created as a copy of a shared ptr The existence or destruction of weak ptr copies of a shared ptr have no effect on the shared ptr or its other copies After all copies of a shared ptr have been destroyed all weak ptr copies become empty std shared ptr lt int gt p1 std make shared lt int gt 5 std weak ptr lt int gt wp1 p1 p1 owns the memory std shared ptr lt int gt p2 wp1 lock Now p1 and p2 own the memory p2 is initialized from a weak pointer so you have to check if the memory still exists if p2 DoSomethingWith p2 p2 is destroyed Memory is owned by p1 p1 reset Free the memory std shared ptr lt int gt p3 wp1 lock Memory is gone so we get an empty shared ptr if p3 code will not execute ActionThatNeedsALivePointer p3 Because the implementation of shared ptr uses reference counting circular references are potentially a problem A circular shared ptr chain can be broken by changing the code so that one of the references is a weak ptr Multiple threads can safely simultaneously access different shared ptr and weak ptr objects that point to the same object 11 The referenced object must be protected separately to ensure thread safety shared ptr and weak ptr are based on versions used by the Boost libraries citation needed C Technical Report 1 TR1 first introduced them to the standard as general utilities but C 11 adds more functions in line with the Boost version Other types of smart pointers editThere are other types of smart pointers which are not in the C standard implemented on popular C libraries or custom STL some examples include hazard pointer 12 and intrusive pointer 13 14 See also editauto ptr Fat pointer Tagged pointer Opaque pointer Reference computer science Boost C libraries Automatic Reference Counting Resource acquisition is initialization RAII Garbage collection in computer programmingReferences edit Kline Marshall September 1997 C FAQs Lite s sections on reference counted smart pointers and copy on write reference semantics in the freestore management FAQs cis usouthal edu Retrieved 2018 04 06 Colvin Gregory 1994 proposal to standardize counted ptr in the C standard library PDF open std org Retrieved 2018 04 06 Klabnik Steve Nichols Carol 2023 2018 15 Smart Pointers The Rust Programming Language 2 ed San Francisco California USA No Starch Press Inc pp 315 351 ISBN 978 1 7185 0310 6 xxix 1 527 3 pages Stroustrup Bjarne A history of C 1979 1991 PDF Retrieved 2018 04 06 Dahl Ole Johan Nygaard Kristen September 1966 SIMULA An ALGOL based simulation language PDF folk uio no Retrieved 2018 04 06 Taligent s Guide to Designing Programs section Use special names for copy create and adopt routines Sutter Herb 2013 04 20 Trip Report ISO C Spring 2013 Meeting isocpp org Retrieved 2013 06 14 a b ISO 14882 2011 20 7 1 CERT C Secure Coding Standard ISO 14882 2014 20 7 1 boost shared ptr thread safety NB Does not formally cover std shared ptr but is believed to have the same threading limitations folly Hazptr h at main facebook folly github com Boost SmartPtr The Smart Pointer Library 1 81 0 boost org EASTL intrusive ptr h at master electronicarts EASTL github com Further reading editMeyers Scott 2014 Effective Modern C Sebastopol California USA O Reilly Media ISBN 978 1 49190399 5 OCLC 884480640 Alexandrescu Andrei 2001 Smart Pointers Modern C Design Generic Programming and Design Patterns Applied Addison Wesley Sutter Herb 2002 08 01 The New C Smart er Pointers Smart Pointers What Why Which Yonat Sharon Smart Pointers Overview John M DlugoszExternal links editcountptr hpp The C Standard Library A Tutorial and Reference by Nicolai M Josuttis Boost Smart Pointers Smart Pointers in Delphi Smart Pointers in Rust Smart Pointers in Modern C Retrieved from https en wikipedia org w index php title Smart pointer amp oldid 1188330871, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.