2015-05-18 48 views
11

我檢查使用valgrind類指針任何內存泄漏的可能性,並發現了下面的程序沒有內存泄漏:decltype(new any_type())可能發生內存泄漏嗎?

#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; 
} 

這怎麼可能呢?

回答

16

decltype(和sizeof)的操作數未被評估,因此不會發生任何副作用,包括內存分配。只有類型是在編譯時確定的。

所以這裏唯一的內存分配是在make_unique和第一個new base()。前者由unique_ptr析構函數釋放,後者由delete b2釋放,不留任何泄漏。

+2

這個特別有趣的結果是像[std :: declval](http://en.cppreference.com/w/cpp/utility/declval)這些專門用於這些表達式的函數, 'decltype(std :: declval ()。method())',實際上並沒有在任何地方實際定義。 – cartographer

8

decltype是一個關鍵字,用於查詢表達式的類型。它只是分析表達式的類型;它並不實際執行它。

所以,不但不會泄漏,您可以decltype的平方根-1沒有任何錯誤,依此類推。

2

因爲decltype和模板處理(類型特徵類)是編譯時間只。運行時實際上沒有發生任何事情。