Учитывая следующий пример кода:Должен ли я инициализировать 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'. Если «новые» выбросы имеют определенную утечку памяти. –
Код утечки памяти, две вещи совершенно разные –