您返回一個堆分配對象,這意味着您轉移所有權。我會建議你使用std::unique_ptr
返回類型
std::unique_ptr<Y> func(param)
{
return std::unique_ptr<Y>(new Y(param));
}
更妙的是使用std :: make_unique(如果它已經可用,否則寫你自己的),或者 - 如果你使用的shared_ptr - 的std :: make_shared。對於異常安全以及shared_ptr更高效的情況更好。
std::unique_ptr<Y> func(param)
{
return make_unique<Y>(param);
}
std::shared_ptr<Y> func(param)
{
return std::shared_ptr<Y>(param);
}
並注意您的func
複製了參數。您可能想要使用轉發來避免這種情況。
template<class T, class U>
std::unique_ptr<T> make_unique1(U&& u)
{
return std::unique_ptr<T>(new T(std::forward<U>(u)));
}
template<class T, class... U>
std::unique_ptr<T> make_unique(U&&... u)
{
return std::unique_ptr<T>(new T(std::forward<U>(u)...));
}
不必返回本地對象,你返回一個副本。它也是'std :: shared_ptr'。使用'std :: make_shared'。 – user657267 2014-12-19 07:57:55
將'share_ptr'改爲'shared_ptr'後,它應該可以工作。 – 2014-12-19 07:58:15
在任何情況下,您都返回一個本地對象,在這兩種情況下返回的值都是*拷貝*。在第一個指針是副本,並在第二個對象被複制。另外,也許不相關,但是你不應該將'std :: shared_ptr'和'std :: unique_ptr'看作*指針*,而應該從大多數情況下來看待它們。 – 2014-12-19 08:00:10