#include <iostream>
#include <string>
#include <vector>
#include <memory>
using namespace std;
class C
{
public:
int a;
C(int aa=0) : a(aa) {};
~C(){
cout << "delete C" << endl;
};
};
void foo()
{
unique_ptr<C> up(new C(10));
weak_ptr<int> wp;
shared_ptr<int> sp1(wp); //產生例外
}
int main()
{
foo();
return 0;
}
很多書上寫unique_ptr可以保證即便拋出例外,記憶體也會被釋放,但上面這個例子確沒有輸出“delete C”,請問這是為什么呢????
uj5u.com熱心網友回復:
因為程式例外終止了。你把main改成以下再試試int main()
{
try {
foo();
} catch (...) {} //捕獲例外,不讓程式例外終止,“delete C”應該會列印
return 0;
}
uj5u.com熱心網友回復:

為什么《C++標準庫-第二版》中會這么寫呢,是書上寫錯了??
uj5u.com熱心網友回復:
拋了例外而不捕獲處理,后面所有邏輯都不會再執行了。質疑書是好事,但你的代碼跟書上一樣嗎?問題明明出在例外那一句,還去質疑例外前面的做什么呢。
weak_ptr是用來配合shared_ptr用的,一般是以某shared_ptr作為引數進行初始化。
而你weak_ptr wp是使用默認構造初始化的,它就不能用來直接初始化其它shared_ptr。
除非呼叫lock()先將weak_ptr轉換為空指標的shared_ptr:
weak_ptr<int> wp;
shared_ptr<int> sp(wp.lock());
uj5u.com熱心網友回復:
書上說的不用catch是想說不用捕獲unique_ptr本身那句執行的例外吧。并不代表其它陳述句沒有例外。uj5u.com熱心網友回復:
如果你的行程一直都不捕獲,那確實不需要去delete,整個行程都直接掛了,所有使用的記憶體都自動回收。uj5u.com熱心網友回復:
后面的例外是我故意制造的,這部分是在講unique_ptr這個智能指標,書中提到如果使用了unique_ptr,那就“再也不需要catch陳述句了”,這句話我理解偏了,它的意思其實是不用再寫try-catch來釋放這指標指向的資源了,并不是說智能指標在發生未捕獲例外時,仍然可以正常釋放資源,就像你說的,未捕獲例外是系統級的嚴重錯誤,程式立刻終止,不會再有其他動作了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98881.html
標籤:C++ 語言
上一篇:/* */會被替換為什么?
下一篇:資料結構隊串列
