2013-07-28 47 views
0
#include <iostream> 
#include <boost/thread/thread.hpp> 
#include <malloc.h> 

class callable { 
    public: 
    void operator()() { 
     std::cout << "Thread Run" << std::endl; 
    } 
} 

void run() { 
    callable c; 
    boost::thread t(boost::ref(c)); 
    t.join(); 
} 

int main() { 
    int alloc = mallinfo().uordblks; 
    run(); 
    int leaked = mallinfo().uordblks - alloc; 
    if(leaked) 
    std::cout << "mem leak: " << leaked << std::endl; 
    return 0; 
} 

它在屏幕上打印「mem leak:336」,有人能解釋爲什麼嗎? 我預計'泄漏'將爲0.C++ boost線程,下面是一個合法的內存泄漏?

+0

不是由POSIX或C類標準規定的該功能mallinfo的。我真的懷疑這個功能。 – Saby

+0

我建議在你的程序中的不同位置使'alloc'成爲一個全局變量並添加類似於'cout <<「Mem status:」<< mallinfo()。uordblks - alloc << std :: endl;'的代碼。這可以幫助您確定內存泄漏的位置。分享並享受。 –

+0

@BobJarvis那麼,在這個代碼示例中,如果你要註釋掉線程實例,那麼「泄漏」的內存就是0. – roeyc

回答

0

在具有32位C int類型的64位系統上,struct mallinfo中的int字段可能會溢出,並且可能會回到小值或負值,或者希望限制在INT_MAX的 。這是一個已知的C庫問題,Devel :: Mallinfo不會去做任何有關它的事情 。請檢查下面的鏈接:

http://metacpan.org/pod/Devel::Mallinfo

我會使用POSIX或C標準接受的其他功能,建議你..