Подтвердить что ты не робот

Возможны ли утечки памяти с помощью decltype (new any_type())?

Я проверяю возможность утечки памяти с помощью указателей классов с помощью valgrind и выяснил, что следующая программа не имеет утечек памяти:

#include <iostream>
#include <utility>
#include <memory>

using namespace std;

class base{};

int main()
{
  unique_ptr<base> b1 = make_unique<base>();
  base *b2 = new base();
  cout << is_same<decltype(new base()), decltype(b1)>::value << endl;
  cout << is_same<decltype(new base()), decltype(b2)>::value << endl;
  delete b2;
  return 0;
}

Как это возможно?

4b9b3361

Ответ 1

Операнд decltype (а также sizeof) не оценивается, поэтому никаких побочных эффектов, включая выделение памяти, не произойдет. Только тип определяется во время компиляции.

Таким образом, единственные распределения памяти здесь находятся в make_unique и первом new base(). Первый освобождается деструктором unique_ptr, последний - delete b2, не оставляя утечек.

Ответ 2

decltype - это ключевое слово, используемое для запроса типа выражения. Он просто анализирует тип выражения; он фактически не выполняет его.

Таким образом, это не только не приведет к утечке, вы можете decltype получить квадратный корень из -1 без каких-либо ошибок и т.д.

Ответ 3

Потому что decltype и обработка шаблонов (например, классы типа-типа) - это время компиляции. Во время выполнения ничего не происходит.