decltype是否可能导致内存泄漏(new any_type())?

时间:2015-05-18 13:52:13

标签: c++ c++11 memory-leaks g++

我正在使用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;
}

这怎么可能?

3 个答案:

答案 0 :(得分:16)

decltype(以及sizeof)的操作数未被评估,因此任何副作用(包括内存分配)都不会发生。在编译时只确定类型。

因此,此处唯一的内存分配位于make_unique和第一个new base()。前者由unique_ptr析构函数释放,后者由delete b2释放,不会泄漏。

答案 1 :(得分:8)

decltype是用于查询表达式的类型的关键字。它只是分析表达的类型;它并没有真正执行它。

所以,这不仅不会泄漏,你可以decltype -1的平方根没有任何错误,等等。

答案 2 :(得分:2)

因为decltype和模板处理(如类型特征类)只是编译时间。在运行时没有发生任何事情。