lundi 25 novembre 2019

Why the object is still exists after std::move function

I have a question regarding std::move function. Please refer to the code below:

#include <iostream>
#include <memory>

using namespace std;

class CPointer {
public:
    CPointer(double a, double b)
    {
        m_dX = a;
        m_dY = b;
    }

    ~CPointer()
    {
        m_dX = m_dY = 0;
    }


    double getX() const
    {return m_dX;}

    double getY() const
    {return m_dY;}

private:
    double m_dX;
    double m_dY;
};

class CContainer 
{
public:
    CContainer(CPointer* p)
    {
        m_p = p;
    }

    ~CContainer()
    {
        m_p = nullptr;
    }

    CPointer* getP() const
    {return m_p;}

private:
    CPointer* m_p;

};


class CBigContainer
{
public:
    CBigContainer(CContainer* p)
    {
        m_p = p;
    }
    ~CBigContainer()
    {
        m_p = nullptr;
    }
    CContainer* getP() const
    {return m_p;}

private:
    CContainer* m_p;
};

int main()
{
    CPointer* pPointer = new CPointer(150,360);

    cout << "1.) " << pPointer->getX() << " , " << pPointer->getY() << "\n";

    std::shared_ptr<CContainer> spContainer = std::make_shared<CContainer>(pPointer);

    cout << "2.) " << pPointer->getX() << " , " << pPointer->getY() << "\n";

    std::shared_ptr<CBigContainer> spBigContainer = std::make_shared<CBigContainer>(std::move(spContainer.get())); //<--- std::move here

    cout << "3.) " << spBigContainer->getP()->getP()->getX() << " , " << spBigContainer->getP()->getP()->getY() << "\n";
    cout << "4.) " << spContainer->getP()->getX() << " , " << spContainer->getP()->getY() << "\n";
    cout << "5.) " << pPointer->getX() << " , " << pPointer->getY() << "\n";

    return 0;
}

And this is the result :

enter image description here

My question is , I am using a std::move

std::shared_ptr<CBigContainer> spBigContainer = std::make_shared<CBigContainer>(std::move(spContainer.get()));

So I am expecting the spContainer cannot be used after the line of code, because the object inside smart pointer is removed. But it still work fine. It seems like has no different with not using std::move in this case.

Can you explain to me in details ? Thank you very much.

Aucun commentaire:

Enregistrer un commentaire