2013-10-25 66 views
2

我不認爲我已經掌握了shared_ptr如何shared_ptr <T>訪問T的元素或功能

示例代碼:

shared_ptr<ofstream> logger; 
int main(){ 

    logger = make_shared<ofstream>(new ofstream("ttt.txt")); 
    *logger <<"s"; 
    return 0; 
} 

錯誤1個錯誤C2664: '的std :: basic_ofstream < _Elem,_Traits> :: basic_ofstream(常量字符*,性病::的ios_base ::用於openmode,INT)' :不能從轉換參數1 '的std :: basic_ofstream < _Elem,_Traits>' 到 '爲const char *' C:\程序文件(86)\微軟的Visual Studio 10.0 \ VC \包括\ xxshared 13

被修改:

[ 
In the mean time, if I wanna close the ofstream while some crashes happened. 
How can I do it? 
I mean if shared_ptr release the memory without closing the file. 
There would be problems. 
] 

我不知道如何做到這一點。或者,也許這完全是無稽之談。希望任何人都能拋出一個想法或指出我對shared_ptr的理解中缺乏的部分。

回答

6

make_shared函數接受的參數將被傳遞給構造函數T; make_shared的目的是爲了避免通過構建shared_ptrnew來進行額外分配。

對於你的情況,你想構造一個使用它的ofstream(const char*)構造函數的ofstream,所以你應該只使用make_shared<ofstream>("ttt.txt")

關於你的編輯,如果你的應用程序崩潰了,你不應該試圖清理資源。有什麼可怕的事情使它崩潰,誰知道它處於什麼狀態;你可以通過嘗試做任何事情而造成損害。如此一來,當應用程序終止時,您的操作系統將清理應用程序擁有的大部分資源,例如文件句柄,無論是優雅還是不正常。

+0

感謝您的回答。但是,make_shared和shared_ptr (new T())有什麼區別; –

+1

@ChrisSu:區別在於你不必自己使用'new'。這有兩個好處:(1)在初始化共享指針之前沒有導致內存泄漏的異常的危險; (2)'make_shared'效率更高,因爲它可以在單個分配中爲對象和共享控制結構分配內存,如果您自己分配對象,則需要兩個內存。 –

+0

@MikeSeymour非常感謝。這是有益的和保險。 –

相關問題