(2020年04月15日)
之前在高程中学了一点智能指针,学下来感觉智能指针除了计数没啥用了,今天看到了一些智能指针的用例。
RAII与对象的生命周期有关,要求对象使用的资源(内存空间、文件描述符、套接字、互斥锁、数据库连接等)必须在使用前就已经获得。而RRID几乎相同,要求销毁对象是释放所使用的资源。
RAII保证任何时候使用对象都能访问到需要使用的资源:
在C++中,RAII/RRID是通过类来实现的:
如此一来,只需要创建一个局部对象就可以保证资源可用,而又不需要手动的归还它了。
C++建议使用std::lock_guard
来获取锁。
std::mutex
类型的互斥锁对象。std::lock_guard(std::mutex &)
对象;lock_guard
的生命周期结束被销毁,程序自动离开临界区。std::mutex mtx;
void critical() {
std::lock_guard<std::mutex> lock(mtx);
// do something
}
程序猿无须在线程函数结束时手动释放锁离开临界区。
当需要返回字符串、打开文件时,可以使用智能指针,这样只要所有使用该内存、文件的对象都被销毁了,智能指针计数变为0,也会被自动销毁。
void func() {
Object foo, *bar;
bar = new Object();
{
shared_ptr<File> file = new File("..."); // counter = 1, file opened
foo.setFile(file); // counter = 2
bar.setFile(file); // counter = 3
} // counter = 2
delete bar; // counter = 1
} // counter = 0, file closed
file
的生命周期将会持续到foo
和bar
都被销毁之后,使用者无需关心文件有没有被关闭。