3. C++ STL中RAII的应用
3.1 智能指针
智能指针是RAII的一种实现,它是一种模板类,用于管理动态分配的对象。智能指针的主要作用是自动释放内存,从而避免内存泄漏。C++11中提供了三种智能指针:unique_ptr、shared_ptr和weak_ptr。它们的详细原理将在之后的文章中介绍。这里我们以unique_ptr为例,它的构造函数如下:
template< class T, class Deleter = std::default_delete<T> > class unique_ptr;
1
unique_ptr的析构函数会自动释放内存,因此,我们可以通过unique_ptr来管理动态分配的内存,从而避免内存泄漏。例如:
std::unique_ptr<int> ptr = std::make_unique<int>(1); // release memory when ptr is out of scope
1
3.2 互斥锁
在多线程编程中,std::lock_guard, std::unique_lock, std::shared_lock等也利用了RAII的原理,用于管理互斥锁。当这些类的等对象创建时,会自动获取互斥锁;当对象销毁时,会自动释放互斥锁。
std::lock_guard的构造函数如下:
template< class Mutex > class lock_guard;
1
std::lock_guard的析构函数会自动释放互斥锁,因此,我们可以通过std::lock_guard来管理互斥锁,从而避免忘记释放互斥锁。例如:
std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx); // unlock when lock is out of scope
1
2
3
不使用RAII的情况下,我们需要手动释放互斥锁,如下所示: