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 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 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. Creating new objects 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. unique_ptr C++11 introduces , defined in the header . A is a container for a