我写了一段简单的代码来尝试使用C++11中的make_shared。当我调用以下代码时,我不明白为什么:
std::shared_ptr<MyClass> x = std::make_shared<MyClass>(MyClass());
默认构造函数被调用并调用了移动构造函数。这一开始看起来很好,因为移动构造函数不会创建副本。但是,如果我注释掉MyClass的移动构造函数实现,它将调用默认构造函数,然后调用复制构造函数,这似乎违反了make_shared的目的。
#include <iostream>
#include <memory>
//-----------------------------------------------------------
class MyClass {
public:
// default constructor
MyClass() :
_data(0.0)
{
_data = (float)3.14;
std::cout << "MyClass::default constructor - data=" << _data << " ; class=" << this << std::endl;
};
// copy constructor
MyClass(const MyClass& input)
{
_data = input._data;
std::cout << "MyClass::copy constructor - data=" << _data << " ; class=" << this << std::endl;
};
// move constructor
MyClass(MyClass&& other)
{
std::cout << "MyClass::move constructor(before) - data=" << _data << " ; class=" << this << std::endl;
_swap(*this, other);
std::cout << "MyClass::move constructor(after) - data=" << _data << " ; class=" << this << std::endl;
};
// destructor
~MyClass()
{
std::cout << "MyClass::destructor - data=" << _data << " ; class=" << this << std::endl;
};
private:
// swap
void MyClass::_swap(MyClass& X, MyClass& Y)
{
std::swap(X._data, Y._data);
}
// members
float _data;
};
//-----------------------------------------------------------
int main()
{
std::shared_ptr<MyClass> x = std::make_shared<MyClass>(MyClass());
std::cout << std::endl << "Address for x: " << x << std::endl;
std::cout << std::endl << "Press Enter to exit." << std::endl;
std::cin.ignore();
return 0;
}
上述代码的输出结果为:
MyClass::default constructor - data=3.14 ; class=000000000019F860
MyClass::move constructor(before) - data=0 ; class=00000000003C3440
MyClass::move constructor(after) - data=3.14 ; class=00000000003C3440
MyClass::destructor - data=0 ; class=000000000019F860
Address for x: 00000000003C3440
Press Enter to exit.
MyClass::destructor - data=3.14 ; class=00000000003C3440
如果我注释掉移动构造函数,输出结果将是这样的:
MyClass::default constructor - data=3.14 ; class=000000000016FA00
MyClass::copy constructor - data=3.14 ; class=00000000001B3440
MyClass::destructor - data=3.14 ; class=000000000016FA00
Address for x: 00000000001B3440
Press Enter to exit.
MyClass::destructor - data=3.14 ; class=00000000001B3440
也许我对make_shared的理解有缺陷。有没有人能够解释一下为什么会发生这种情况?谢谢。
make_shared
需要将您明确创建的未命名MyClass()
临时对象复制/移动到它分配的共享对象空间中。如果可以使用移动构造函数,则使用移动构造函数,否则使用复制构造函数。您期望会发生什么? - Chris Dodd