Re[2]: JetBrains - Был на собеседе
От: Андруха Россия  
Дата: 14.07.17 18:18
Оценка: +2
Здравствуйте, pkl, Вы писали:

pkl>Был на собеседе примерно год назад.


pkl>чтобы было можно. Отчего возникает pure virtual call. Был вопрос: "почему в этом коде течёт память: std::shared_ptr<T> t(new T( f() ) );" f() -- память не выделяет, возвращает int, может кидануть эксцепшн.



Добрый день/вечер!

Может быть уже поздно, но всеже...
Наткнулся на этот пост — решил поисследовать вопрос.

Мне кажется Вы неправильно запомнили что собесед спрашивал.
Есть там проблема в плюсах с точками следования + исключения — тут да — возможна утечка памяти в принципе

Скорее всего кусок проблемного кода выглядел по типу:

1).
someFunction(std::shared_ptr<Foo>(new Foo), getRandomKey()); (отсюда http://archive.kalnytskyi.com/2011/11/02/smart-pointers-in-cpp11/)

2).
или та же проблема только без shared_ptr:
f( new X(i++), new Y(i) ); (отсюда http://cpp-reference.ru/articles/sequence-points-and-expression-evaluation/)

тема в том что C++ не гарантирует порядок вычисления аргументов функции и более того как оказывается (только сегодня благодяря Вашему посту раскопал) вполне допускает для первого случая вычисление в след порядке:

1. new Foo (запомнили сырой успешно созданный указатель во временной переменной)
2. getRandomKey()
3. std::shared_ptr<Foo>( сырой успешно созданный указатель во временной переменной )

Если на 2. м шаге исключение в (getRandomKey()) — то память с 1. го шага утечет

И я подозреваю, что этот вопрос являлся следствием предыдущего: чем make_shared лучше new shared_ptr<Foo>(new Foo)


Сколько C++ не используй — постоянно открываешь что то новое

--
Regards
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.