2017-01-04 6 views
1

я сталкиваюсь вопрос с shared_ptr, кажется, что для инициализации пустого shared_ptr, есть два распространенных способа, как цитата из std::shared_ptr: reset() vs. assignmentНазначить недавно построенный shared_ptr

T { 
    T(X x, Y y); 
    ~T(); 

} 
shared_ptr<T> p; 
p.reset(new T(x,y)); 
p = make_shared<T>(t1) //t1 is a T type object 

Однако, почему это не будет работать?

p = shared_ptr<T>(new T(x,y)); 

Это просто плохая практика или это просто неправильно? Благодаря!

Там есть ответ о том, что make_shared является более эффективным, чем новый с точки зрения строительства Is make_shared really more efficient than new?:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); //copy?? 
std::shared_ptr<Object> p2(new Object("foo")); //conversion? 

ответ

1

Однако, почему это не сработает?

p = shared_ptr<T>(new T(x,y)); 

Это нормально. Он используется таким образом в связанном ответе.

Преобразование выражения new в shared_ptr небезопасно, когда другие подвыражения могут выдавать исключения. Из-за неуказанного порядка оценки можно получить утечку памяти. Но new в качестве инициализатора для именованной переменной является безопасным.

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); //copy?? 
std::shared_ptr<Object> p2(new Object("foo")); //conversion? 

Проблема состоит в том, что shared_ptr требует счетчик ссылок на кучу. make_shared способен объединить общий объект и счетчик ссылок в одно выделение, тогда как преобразование принимает существующий ранее объект и поэтому необходимо снова вызвать new только для подсчета.

0

Является p = shared_ptr<T>(new T()) просто плохая практика или это просто так?

Вы путаете указатель NULL с указателем на объект, построенный по умолчанию. Ни один из них не является «правильным» или «неправильным»; они просто имеют разную семантику и подходят в разных обстоятельствах.

+0

Благодарим за ваш ответ, не возражаете ли вы продолжить разработку своего ответа? Я думаю, shared_ptr p; даст нулевой указатель, в то время как все три следующие строки назначат объект, который будет управляться указателем, в то время как я пытаюсь выяснить разницу между последней и предыдущей? Извините, если мои концепции полностью ошибочны. – user3113633

 Смежные вопросы

  • Нет связанных вопросов^_^