Skip to main content

std::unique_ptr in c++ | C++ 11

std::unique_ptr :

C++11 introduces std::unique_ptr, defined in the header .

It is a container for a raw pointer. 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.

Reason for it won’t allow copy :
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.



Complate Example: 


// C++ program to illustrate the use of unique_ptr
#include
#include
using namespace std;
class A
{
public:
    void show()
    {
        cout<<"A::show()"<
    }
};
int main()
{
    unique_ptr p1 (new A);
    p1 -> show();
    // returns the memory address of p1
    cout << p1.get() << endl;
    // transfers ownership to p2
    unique_ptr p2 = move(p1);
    p2 -> show();
    cout << p1.get() << endl;
    cout << p2.get() << endl;
    // transfers ownership to p3
    unique_ptr p3 = move (p2);
    p3->show();
    cout << p1.get() << endl;
    cout << p2.get() << endl;
    cout << p3.get() << endl;
    return 0;
}



Output:

A::show()
0x1c4ac20
A::show()
0          // NULL
0x1c4ac20
A::show()
0          // NULL
0          // NULL
0x1c4ac20

Comments

Popular posts from this blog

const used with functions

const used with functions : class Dog {    int age;    string name; public:    Dog() { age = 3; name = "dummy"; }         // const parameters and these are overloaded functions    void setAge(const int& a) { age = a; }    void setAge(int& a) { age = a; }         // Const return value    const string& getName() {return name;}         // const function and these are overloaded functions    void printDogName() const { cout << name << "const" << endl; }  // value of name can't be modified    void printDogName() { cout << getName() << " non-const" << endl; } }; int main() {    Dog d;    d.printDogName();        const Dog d2;    d2.printDogName();     }

Structured Bindings

Returning multiple Values from function C++ 11 vs C++ 17 Returning compound objects Iterating over a compound collection Direct initialization Returning multiple Values from function C++ 11 vs C++ 17 :  C++ 11 (std::tie): std::tuple mytuple() {     char a = 'a';     int i = 123;     bool b = true;     return std::make_tuple(a, i, b);  // packing variable into tuple } To access return value using C++ 11, we would need something like: char a; int i; bool b; std::tie(a, i, b) = mytuple();  // unpacking tuple into variables Where the variables have to be defined before use and the types known in advance. C++ 17 : auto [a, i, b] = mytuple(); Returning compound objects :  This is the easy way to assign the individual parts of a compound type (such as a struct, pair etc) to different variables all in one go – and have the correct types automatically assigned. So let’s have a look at an ...

STL :: std::array<> in c++

Example:          int a[5] = {10,20,30,40,50}; array b; std:copy(std::begin(a),std::end(a),std::begin(b)); for(int x : b) { cout< } cout<<"begin functional iterator : "< for(auto val = b.begin(); val cout<<*val< cout<<"R begin functional iterator : "< for(auto val = b.rbegin(); val cout<<*val< cout<<"AT Function : "< cout<<"at(2) : "< cout<<"front Function : "< cout<<"front() : "< cout<<"back Function : "< cout<<"back() : "< cout<<"[] operator : "< cout<<"b[2] : "<