让我们考虑下面的代码:
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是真的。为什么?你能解释一下这是怎么回事吗?
我在网上查资料。我想知道它是怎么运作的
1条答案
按热度按时间wztqucjr1#
在这些定义中,
std::make_share<B>("x")
创建了一个临时的std::shared_ptr
,它在完整表达式结束时(实际上是在下一个;
)不再存在,这意味着每个指针指向的对象在创建后立即被销毁。当
atom2X
被声明时,atom1X
指向的对象已经被销毁,它的存储空间也被释放了。碰巧的是,第(1)行中分配的对象先前占用的存储空间正好可以容纳一个B
对象,所以它在第(2)行中被重新使用。实际上,如果删除所有智能指针,您可以将代码视为等效于以下代码: