2016-11-29 16 views
0

智能指針管理的分配內存是否保證在發生異常時釋放,如下所示?在C++ shared_ptr用法下面會有泄漏嗎?

#include <memory> 

void test(std::shared_ptr<int> sptr) 
{ 
    throw "exception"; 
} 

int main() 
{ 
    std::shared_ptr<int> ptr(new int(1)); 
    test(ptr); 
    return 0; 
} 

我想執行的代碼,把斷點shared_ptr析構函數,但我沒有看到它獲取調用。我認爲記憶應該自己清理。我是對的,還是不會清理?

+0

當*時釋放*由於沒有更多的代碼可以運行,因此沒有什麼可以解放它的。 –

回答

6

語言標準指出:

如果沒有找到匹配的處理器,功能std::terminate()是 調用;堆棧是否被這個調用 std::terminate()前展開是實現定義

所以你的程序不能保證後自己清理,但大部分(如果不是全部)現代操作系統將做到這一點後-mortem。

如果您發現異常,shared_ptr的實例將被正確銷燬,確保無泄漏。

0

以更好的例子了理解:

#include <memory> 
#include <windows.h> 

using namespace std; 

class A 
{ 
public: 
    A() 
    { 
     cout << "Constructor" << endl; 
    } 
    ~A() 
    { 
     cout << "destructor" << endl; 
    } 
}; 

void test(std::shared_ptr<A> sptr) 
{ 
    throw "exception"; 
} 

void function() 
{ 
    std::shared_ptr<A> ptr(new A); 
    test(ptr); 
} 

int main() 
{ 
    function(); 
    Sleep(5000); 
} 

程序崩潰之前,只有一個構造函數被調用這表明它不會做破壞。 但是,如果我們在Visual Studio中進行調試並且在異常之後繼續說,那麼甚至會調用析構函數。