c++ 共享指针中对象的唯一性

7gyucuyw  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(169)

让我们考虑下面的代码:

class A { 
    string a;
    public A(string a) : a(a) { }
};

class B : public A {
    public B(string a) : A(a) { }
};

int main() {
    std::shared_ptr<A> x1 = std::make_shared<B>("x");
    std::shared_ptr<A> x2 = std::make_shared<B>("x");

    A* atom1 = x1.get();
    A* atom2 = x2.get();

    A* atom1X = std::make_shared<B>("x").get();
    A* atom2X = std::make_shared<B>("x").get();

    bool condition1 = (atom1 == atom2);
    bool condition2 = (atom1X == atom2X);

}

结果让我很惊讶,因为条件1是假的,而条件2是真的。为什么?你能解释一下这是怎么回事吗?
我在网上查资料。我想知道它是怎么运作的

wztqucjr

wztqucjr1#

A* atom1X = std::make_shared<B>("x").get(); // (1)
A* atom2X = std::make_shared<B>("x").get(); // (2)

在这些定义中,std::make_share<B>("x")创建了一个临时的std::shared_ptr,它在完整表达式结束时(实际上是在下一个;)不再存在,这意味着每个指针指向的对象在创建后立即被销毁。
atom2X被声明时,atom1X指向的对象已经被销毁,它的存储空间也被释放了。碰巧的是,第(1)行中分配的对象先前占用的存储空间正好可以容纳一个B对象,所以它在第(2)行中被重新使用。
实际上,如果删除所有智能指针,您可以将代码视为等效于以下代码:

A* x1 = new B("x");
A* x2 = new B("x");

A* atom1 = x1;
A* atom2 = x2;

A* atom1X = new B("x");
delete atom1X;
A* atom2X = new B("x");
delete atom2X;

相关问题