You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:15:27