22 June 2022

C++ 核心指南目录

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_ptrshared_ptr 用于多个所有者共享所有权。

过多使用shared_ptr会造成性能影响。shared_ptr用原子操作维护一个引用计数器,有一定性能开销。

其他方案

让单独一个对象维护共享资源,当其他使用者完成工作后,由这个对象负责销毁资源。