2014-05-11 273 views
0

下面是代碼,該程序導致內存泄漏。我不知道它是如何發生的?內存泄漏如何發生?

#include <iostream> 
#include <memory> 
#include <stdexcept> 
using namespace std; 

void test(shared_ptr<string> &ptr, int num) { 
    cout << "pass test:" << *ptr << " " << num << endl; 
} 

int fun() { 
    throw new runtime_error("runtime error"); 
    return 0; 
} 

int main() { 

    try { 
     // test(static_cast<shared_ptr<string> >(new string("hello")), fun()); 
     // Solution 
     shared_ptr<string> sps(new string("h")); 
     test (sps, fun()); 
    } catch (runtime_error *e) { 
     cout << e->what() << endl; 
    } 
    return 0; 
} 

我使用的valgrind 測試內存泄漏。

==4726== 
==4726== HEAP SUMMARY: 
==4726==  in use at exit: 54 bytes in 2 blocks 
==4726== total heap usage: 6 allocs, 4 frees, 248 bytes allocated 
==4726== 
==4726== LEAK SUMMARY: 
==4726== definitely lost: 16 bytes in 1 blocks 
==4726== indirectly lost: 38 bytes in 1 blocks 
==4726==  possibly lost: 0 bytes in 0 blocks 
==4726== still reachable: 0 bytes in 0 blocks 
==4726==   suppressed: 0 bytes in 0 blocks 
==4726== Rerun with --leak-check=full to see details of leaked memory 
==4726== 
==4726== For counts of detected and suppressed errors, rerun with: -v 
==4726== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 

我認爲sps會刪除自身時excption由fun()誘發。更重要的是,test()中對shared_ptr的引用將不會分配內存。

智能指針的行爲很奇怪。

+4

不要用'new'拋出異常,C++不是java! –

回答

5

例外是你的泄漏。你正在實例化它,而不是刪除。 看看this