使用标准库的智能指针
* 注意,在使用数组的时候需要使用数组的特化版本。
#include <iostream> #include <memory> std::unique_ptr<char[]> division(int x, int y) { std::unique_ptr<char[]> sp(new char[100]{}); if (y == 0) { throw "Please do not use 0 as a divisor"; } std::sprintf(sp.get(), "%d / %d = %d\n", x, y, x / y); return sp; } int main() { try { std::unique_ptr<char[]> sp = division(6, 0); std::cout << sp.get() << std::endl; } catch (const char* e) { std::cerr << e << std::endl; } }互斥锁的释放
在多线程编程中,为了保护共享资源,我们通常会使用 互斥量 mutex 来进行保护。
并且在使用资源前进行上锁的 lock() 操作,在使用完毕后用 unlock() 进行解锁。
直接使用互斥量
这里假定在 2000ms 后两个线程都会结束。
#include <iostream> #include <thread> #include <mutex> int x = 0; std::mutex mutex; void fun() { for (int i = 0; i < 100000; i += 1) { mutex.lock(); x += 1; mutex.unlock(); } } int main() { std::thread th1(fun); std::thread th2(fun); th1.join(); th2.join(); std::cout << x << std::endl; }但是这种写法需要开始和结束处都对 mutex 整个对象进行操作。此处代码较短不容易出错,但是当代码量越来越大,各种情况越来越复杂后就很容易遗漏最后的 mutex.unlock(); 解锁操作。
此时就可以使用 RAII 的方式,在构造的时候对 mutex 进行 lock() 操作,在 unlock() 进行解锁操作。