2013-10-25 34 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非常感谢。这是有益的和保险。 –

相关问题