shared_ptr指向对象的唯一性疑问:为何condition1为false而condition2为true?
代码中指针比较结果差异的原因解析
首先贴出修正了语法细节的代码(原代码缺少成员函数的冒号分隔符):
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); // 结果为false bool condition2 = (atom1X == atom2X); // 结果为true }
为什么condition1是false?
x1和x2是两个独立的std::shared_ptr实例,各自通过std::make_shared<B>("x")在堆上创建了完全独立的B对象,每个对象都占据独一无二的内存地址。atom1和atom2分别指向这两个不同的对象内存,所以指针比较结果自然为false。
为什么condition2是true?
std::make_shared<B>("x")创建的是临时std::shared_ptr对象,它的生命周期仅持续到当前表达式结束——也就是执行完A* atom1X = ...;这一行后,临时的shared_ptr会被立即销毁,同时自动释放它管理的B对象内存。- 当下一行再次调用
std::make_shared<B>("x")时,内存分配器刚好复用了之前刚释放的那块内存空间,导致atom1X和atom2X指向了同一个地址,因此比较结果为true。 - 必须强调:这个结果是未定义行为,完全依赖内存分配器的实现和当前程序的内存状态。换个编译器、操作系统,或者程序运行时的内存环境稍有变化,结果就可能变成
false,而且这两个指针属于悬空指针,后续对它们的任何操作都可能引发崩溃或不可预料的问题。
内容的提问来源于stack exchange,提问作者Karol Janic
相关产品推荐
相关产品推荐

