我正在使用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;
}
这怎么可能?
答案 0 :(得分:16)
decltype
(以及sizeof
)的操作数未被评估,因此任何副作用(包括内存分配)都不会发生。在编译时只确定类型。
因此,此处唯一的内存分配位于make_unique
和第一个new base()
。前者由unique_ptr
析构函数释放,后者由delete b2
释放,不会泄漏。
答案 1 :(得分:8)
decltype
是用于查询表达式的类型的关键字。它只是分析表达的类型;它并没有真正执行它。
所以,这不仅不会泄漏,你可以decltype
-1的平方根没有任何错误,等等。
答案 2 :(得分:2)
因为decltype
和模板处理(如类型特征类)只是编译时间。在运行时没有发生任何事情。