c – 具有可选所有权的智能指针

我试图允许一个类包含一个指针,它可以是一个拥有的指针或一个借来的指针.在前一种情况下,它应该破坏拥有的对象本身;在后一种情况下,它不应该破坏指向的对象.

在代码中,我有类A,B和C.我的目标是以下(简化)定义,其中B是需要拥有指针的类:

class C {
    ...
};

class B {
    C *c;
    B(C *c) : c(c) {
    }
};

class A {
    C c1;
    B b1, b2;
    // b2 leaks pointer to C
    A() : b1(&c1), b2(new C()) {
    }
};

当A的实例破坏时,它会破坏c1,b1和b2.理想情况下,b2的破坏应该删除匿名C实例,但是b1的破坏不应该删除任何东西(因为c1将被A直接销毁).

我可以使用什么样的智能指针来实现这一目标?或者,是将所有权标志传递给B的最佳解决方案?

最佳答案 虽然我担心B可能会受到滥用,但您可以这样做:

class B {
    C *c;
    bool owned;

    B(C& c) : c(&c), owned(false) {}
    B(C *c) : c(c), owned(true) {}
    ~B() { if (owned) delete c; }
};

class A {
    C c1;
    B b1, b2;
    A() : b1(c1), b2(new C()) {}
};
点赞