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