我寫了一段簡單的代碼來嘗試make_shared for C++ 11。我不明白爲什麼當我打電話時:std :: make_shared在VS2012中做了兩個構造函數調用
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()'temp顯式複製/移動到它所分配的共享對象空間中。如果可以的話,它使用移動構造函數,如果沒有移動構造函數,則使用複製構造函數。你期望發生什麼? – 2014-08-31 20:38:39
我真的想(在我的腦海裏)做Piotr S.所建議的,所以它只做一個構造函數調用。我沒有完全理解make_shared的語法。謝謝您的意見。 – Mike 2014-08-31 23:59:47