考慮下面的示例代碼:我是否應該在類構造函數內部或外部初始化shared_ptr?
#include <memory>
class Foo {
public:
Foo(std::shared_ptr<int> p);
private:
std::shared_ptr<int> ptr;
};
Foo::Foo(std::shared_ptr<int> p) : ptr(std::move(p)) {
}
class Bar {
public:
Bar(int &p);
private:
std::shared_ptr<int> ptr;
};
Bar::Bar(int &p) : ptr(std::make_shared<int>(p)) {
}
int main() {
Foo foo(std::make_shared<int>(int(256)));
Bar bar(*new int(512));
return 0;
}
兩個Foo和Bar正常工作。但是,在調用構造函數時創建shared_ptr,然後將所有權與std :: move一起傳遞,並僅將對象的引用傳遞給對象並將shared_ptr的創建委託給類構造函數,是否有任何區別?
我認爲第二種方式更好,因爲我不必移動指針。但是,我主要看到了我正在閱讀的代碼中使用的第一種方式。
我應該使用哪一個,爲什麼?
我更喜歡用'std :: make_shared'進行直接初始化。如果'new'拋出一個確定的內存泄漏。 –
代碼泄漏內存,這兩件事情完全不同 –