0

I have implemented both copy constructor and move constructor and what i learned was the program must use Move constructor instead of copy constructor .

class Move
{
private:
    int *data; // raw  pointer

public:
    Move(int);                // constructor
    Move(const Move &source); // copy constructor
    Move(Move &&source);      // Move Constructor
    ~Move();
};

Move::Move(int d)
{
    data = new int;
    *data = d;
    cout << "Constructor for: " << d << endl;
}

Move::Move(const Move &source)
    : Move(*source.data)
{
    cout << "Copy constructor -deep copy for: " << *data << endl;
}

Move::Move(Move &&source)
    : data{source.data}
{
    source.data = nullptr;
    cout << "Move constructor -Moving resource: " << *data << endl;
}

Move::~Move()
{
    if (data != nullptr)
    {
        cout << "Destructor freeing data for : " << *data << endl;
    }
    else
    {
        cout << "Destructor freeing data for nullptr" << endl;
    }
    delete data;
}

//driving function
int main()
{

    vector<Move> vec;
    vec.push_back(Move{10});
    vec.push_back(Move{20});
    vec.push_back(Move{30});
    vec.push_back(Move{40});
    vec.push_back(Move{50});
    vec.push_back(Move{60});
    vec.push_back(Move{70});

    return 0;
}

Output:

Constructor for: 10

Move constructor -Moving resource: 10

Destructor freeing data for nullptr

Constructor for: 20

Move constructor -Moving resource: 20

Constructor for: 10

Copy constructor -deep copy for: 10

Destructor freeing data for : 10

Destructor freeing data for nullptr

Constructor for: 30

Move constructor -Moving resource: 30

Constructor for: 10

Copy constructor -deep copy for: 10

Constructor for: 20

Copy constructor -deep copy for: 20

Destructor freeing data for : 10

Destructor freeing data for : 20

Destructor freeing data for nullptr

Constructor for: 40

Move constructor -Moving resource: 40

Destructor freeing data for nullptr

Constructor for: 50

Move constructor -Moving resource: 50

Constructor for: 10

Copy constructor -deep copy for: 10

Constructor for: 20

Copy constructor -deep copy for: 20

Constructor for: 30

Copy constructor -deep copy for: 30

Constructor for: 40

Copy constructor -deep copy for: 40

Destructor freeing data for : 10

Destructor freeing data for : 20

Destructor freeing data for : 30

Destructor freeing data for : 40

Destructor freeing data for nullptr

Constructor for: 60

Move constructor -Moving resource: 60

Destructor freeing data for nullptr

Constructor for: 70

Move constructor -Moving resource: 70

Destructor freeing data for nullptr

Destructor freeing data for : 10

Destructor freeing data for : 20

Destructor freeing data for : 30

Destructor freeing data for : 40

Destructor freeing data for : 50

Destructor freeing data for : 60

Destructor freeing data for : 70

Narayan Poudel
  • 189
  • 1
  • 14
  • 2
    https://stackoverflow.com/questions/28627348/noexcept-and-copy-move-constructors , mark move ctor as noexcept, you should see different output. More details in attached link. – rafix07 May 12 '22 at 04:24

1 Answers1

1

Because std::vector moves while resizing only if you have a noexcept move constructor. Or you can call vec.reserve(7) to avoid resizing.