Возможны ли утечки памяти с помощью 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;
}
Как это возможно?
Ответы
Ответ 1
Операнд decltype
(а также sizeof
) не оценивается, поэтому никаких побочных эффектов, включая выделение памяти, не произойдет. Только тип определяется во время компиляции.
Таким образом, единственные распределения памяти здесь находятся в make_unique
и первом new base()
. Первый освобождается деструктором unique_ptr
, последний - delete b2
, не оставляя утечек.
Ответ 2
decltype
- это ключевое слово, используемое для запроса типа выражения. Он просто анализирует тип выражения; он фактически не выполняет его.
Таким образом, это не только не приведет к утечке, вы можете decltype
получить квадратный корень из -1 без каких-либо ошибок и т.д.
Ответ 3
Потому что decltype
и обработка шаблонов (например, классы типа-типа) - это время компиляции. Во время выполнения ничего не происходит.