In
computer science
Computer science is the study of computation, automation, and information. Computer science spans theoretical disciplines (such as algorithms, theory of computation, information theory, and automation) to Applied science, practical discipli ...
, 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
In computer science, garbage collection (GC) is a form of automatic memory management. The ''garbage collector'' attempts to reclaim memory which was allocated by the program, but is no longer referenced; such memory is called ''garbage''. G ...
.
[
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
In object-oriented programming (OOP), the object lifetime (or life cycle) of an object is the time between an object's creation and its destruction. Rules for object lifetime vary significantly between languages, in some cases between implement ...
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
Scope or scopes may refer to:
People with the surname
* Jamie Scope (born 1986), English footballer
* John T. Scopes (1900–1970), central figure in the Scopes Trial regarding the teaching of evolution
Arts, media, and entertainment
* Cinem ...
. Smart pointers also eliminate dangling pointer
Dangling pointers and wild pointers in computer programming are pointers that do not point to a valid object of the appropriate type. These are special cases of memory safety violations. More generally, dangling references and wild references are ...
s by postponing destruction until an object is no longer in use.
If a language supports automatic garbage collection (for example, Java
Java (; id, Jawa, ; jv, ꦗꦮ; su, ) is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea to the north. With a population of 151.6 million people, Java is the world's List ...
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
In organizational studies, resource management is the efficient and effective development of an organization's resources when they are needed. Such resources may include the financial resources, inventory, human skills, production resources, or i ...
of objects such as file handles or network socket
A network socket is a software structure within a network node of a computer network that serves as an endpoint for sending and receiving data across the network. The structure and properties of a socket are defined by an application programming ...
s.
Several types of smart pointers exist. Some work with reference counting
In computer science, reference counting is a programming technique of storing the number of references, pointers, or handles to a resource, such as an object, a block of memory, disk space, and others.
In garbage collection algorithms, referenc ...
, others by assigning ownership of an object to one pointer.
History
Even though C++ popularized the concept of smart pointers, especially the reference-counted variety, 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
Simula is the name of two simulation programming languages, Simula I and Simula 67, developed in the 1960s at the Norwegian Computing Center in Oslo, by Ole-Johan Dahl and Kristen Nygaard. Syntactically, it is an approximate superset of ALGOL ...
.[ Simula67's ancestor was ]Simula I
Simula is the name of two simulation programming languages, Simula I and Simula 67, developed in the 1960s at the Norwegian Computing Center in Oslo, by Ole-Johan Dahl and Kristen Nygaard. Syntactically, it is an approximate superset of ALGOL ...
. 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
Sir Charles Antony Richard Hoare (Tony Hoare or C. A. R. Hoare) (born 11 January 1934) is a British computer scientist who has made foundational contributions to programming languages, algorithms, operating systems, formal verification, and c ...
'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.[
]
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
Simula is the name of two simulation programming languages, Simula I and Simula 67, developed in the 1960s at the Norwegian Computing Center in Oslo, by Ole-Johan Dahl and Kristen Nygaard. Syntactically, it is an approximate superset of ALGOL 6 ...
's approach to memory allocationthe ''new'' keyword when allocating a process/record to obtain a fresh ''element'' to that process/recordit is not surprising that C++ eventually resurrected Simula's reference-counted smart-pointer mechanism within ''element'' as well.
Features
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,[ which is an error-prone, labor-intensive approach. ]C++11
C++11 is a version of the ISO/IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versions by ...
introduced a way to ensure correct memory management in this case by declaring the function to return a unique_ptr
,
std::unique_ptr 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
C++11 is a version of the ISO/IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versions by ...
, unique_ptr can be replaced with auto_ptr.
Creating new objects
To ease the allocation of a std::shared_ptrC++11
C++11 is a version of the ISO/IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versions by ...
introduced:
auto s = std::make_shared(constructor, parameters, here);
and similarly std::unique_ptrSince C++14 one can use:
auto u = std::make_unique(constructor, parameters, here);
It is preferred, in almost all circumstances, to use these facilities over the new
keyword.[
]
unique_ptr
C++11
C++11 is a version of the ISO/IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versions by ...
introduces , defined in the header .[
A 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 function can be used to transfer ownership of the contained pointer to another . A unique_ptr
cannot be copied because its copy constructor and assignment operators are explicitly deleted.
std::unique_ptr p1(new int(5));
std::unique_ptr p2 = p1; // Compile error.
std::unique_ptr 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
C++17 is a version of the ISO/IEC 14882 standard for the C++ programming language. C++17 replaced the prior version of the C++ standard, called C++14, and was later replaced by C++20.
History
Before the C++ Standards Committee fixed a 3-year rel ...
. The copy constructor and assignment operators of do not actually copy the stored pointer. Instead, they transfer it, leaving the prior object empty. This was one way to implement strict ownership, so that only one object can own the pointer at any given time. This means that should not be used where copy semantics are needed.[ Since already existed with its copy semantics, it could not be upgraded to be a move-only pointer without breaking ]backward compatibility
Backward compatibility (sometimes known as backwards compatibility) is a property of an operating system, product, or technology that allows for interoperability with an older legacy system, or with input designed for such a system, especially i ...
with existing code.
shared_ptr and weak_ptr
C++11 introduces and , defined in the header .[ C++11 also introduces ( was introduced in C++14) to safely allocate dynamic memory in the RAII paradigm.][
A is a container for a ]raw pointer
In computer science, a pointer is an object in many programming languages that stores a memory address. This can be that of another value located in computer memory, or in some cases, that of memory-mapped computer hardware. A pointer ''refe ...
. It maintains reference counting
In computer science, reference counting is a programming technique of storing the number of references, pointers, or handles to a resource, such as an object, a block of memory, disk space, and others.
In garbage collection algorithms, referenc ...
ownership of its contained pointer in cooperation with all copies of the . An object referenced by the contained raw pointer will be destroyed when and only when all copies of the have been destroyed.
std::shared_ptr p0(new int(5)); // Valid, allocates 1 integer and initialize it with value 5.
std::shared_ptr p1(new int[5]); // Valid, allocates 5 integers.
std::shared_ptr 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 is a container for a raw pointer. It is created as a copy of a shared_ptr
. The existence or destruction of 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 p1 = std::make_shared(5);
std::weak_ptr wp1 ; // p1 owns the memory.
// p2 is destroyed. Memory is owned by p1.
p1.reset(); // Free the memory.
std::shared_ptr p3 = wp1.lock();
// Memory is gone, so we get an empty shared_ptr.
if (p3)
Because the implementation of uses reference counting
In computer science, reference counting is a programming technique of storing the number of references, pointers, or handles to a resource, such as an object, a block of memory, disk space, and others.
In garbage collection algorithms, referenc ...
, 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 and objects that point to the same object.[
The referenced object must be protected separately to ensure thread safety.
and are based on versions used by the Boost libraries. ]C++ Technical Report 1
C, or c, is the third letter in the Latin alphabet, used in the modern English alphabet, the alphabets of other western European languages and others worldwide. Its name in English is ''cee'' (pronounced ), plural ''cees''.
History
"C" ...
(TR1) first introduced them to the standard, as general utilities, but C++11 adds more functions, in line with the Boost version.
See also
* Automatic Reference Counting
* Resource acquisition is initialization (RAII)
* auto_ptr
* Opaque pointer
* Reference (computer science)
* Boost (C++ libraries)
Boost, boosted or boosting may refer to:
Science, technology and mathematics
* Boost, positive manifold pressure in turbocharged engines
* Boost (C++ libraries), a set of free peer-reviewed portable C++ libraries
* Boost (material), a material ...
* Fat pointer
* Garbage collection
Waste collection is a part of the process of waste management. It is the transfer of solid waste from the point of use and disposal to the point of treatment or landfill. Waste collection also includes the curbside collection of recyclable m ...
in computer programming
References
Further reading
*
*
* {{cite web , url=http://www.drdobbs.com/184403837/ , title=The New C++: Smart(er) Pointers , author-first=Herb , author-last=Sutter , author-link=Herb Sutter , date=2002-08-01
Smart Pointers - What, Why, Which?
Yonat Sharon
John M. Dlugosz
External links
The C++ Standard Library - A Tutorial and Reference
' by Nicolai M. Josuttis
Articles with example C++ code
Data types