CppCoreGuidelines F.27 用 shapred_ptr 共享所有权
22 June 2022
F.27: Use a shared_ptr<T>
to share ownership
理由
std::shared_ptr
是共享所有权的标准操作。即指针的最后一个所有者负责删除对象。
例子
#include <iostream> #include <thread> #include <memory> using namespace std; class Image { public: Image(const string ims) {} ~Image() { cout << "~Image" << endl; } }; enum direction : int { top_left, top_right, bottom_left, bottom_right, }; void shade(direction d, shared_ptr<const Image> im) { cout << "shade to " << d << endl; } int main() { shared_ptr<const Image> im{new Image{"Image"}}; std::thread t0 {shade, top_left, im}; std::thread t1 {shade, top_right, im}; std::thread t2 {shade, bottom_left, im}; std::thread t3 {shade, bottom_right, im}; t0.join(); t1.join(); t2.join(); t3.join(); } // detach threads // last thread to finish deletes the image
shade to 0 shade to 1 shade to 2 shade to 3 ~Image
注意
如果只有一个所有者的话,请使用unique_ptr
。 shared_ptr
用于多个所有者共享所有权。
过多使用shared_ptr
会造成性能影响。shared_ptr
用原子操作维护一个引用计数器,有一定性能开销。
其他方案
让单独一个对象维护共享资源,当其他使用者完成工作后,由这个对象负责销毁资源。