Home > Enterprise >  I used an object in my main file (?) despite having transferred ownership before?
I used an object in my main file (?) despite having transferred ownership before?

Time:10-11

I used move semantics a la

        class MyC {
    
    public:
Eigen::MatrixXd f_bar_mat;
    
    MyC::MyC(Eigen::MatrixXd f_bar_mat):f_bar_mat(std::move(f_bar_mat))
    }

In the main I have:

Eigen::MatrixXd f_bar_mat = Eigen::MatrixXd::Random(10000,200);
MyC MyInst(f_bar_mat);
MyC MyNewInst(MyInst.f_bar_mat); //transfer again
std::cout << "Access some element of the original matrix: " << f_bar_mat(3,2) << std::endl;

I realised only later that I erroneously called f_bar_mat in the body of my main after having transferred ownership.

However, the code still works; I don't get an error message.

Can someone help me understand the behaviour? My guess is that std::move then simply resorts to a deep copy. Alternatively, should I be getting a segmentation fault error or will it reference something other than f_bar_mat and create undefined behaviour?

CodePudding user response:

You are not moving main's f_bar_mat anywhere. Nowhere did you call std::move(f_bar_mat) in main.

You are moving only the parameter of the constructor which is also called f_bar_mat but is not the same object as the one in main (since it was not declared as a reference).

Since you are passing f_bar_mat from main as a lvalue to the constructor, the parameter object of the constructor will be copy-constructed from main's f_bar_mat. Only then you will move-construct the class member (also called f_bar_mat) from the parameter object.

Similarly at // transfer again you are not calling std::move on MyInst.f_bar_mat, so you are copy-constructing the constructor's parameter object again.

  • Related