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

管理同一对象时shared_ptr的引用计数为何未增至2?

为什么两次声明shared_ptr后引用计数未增加至2?

你的代码里存在一个核心误解:两次调用std::make_shared<int>(i)创建的是两个完全独立的动态对象,并非同一个。

问题根源

std::make_shared的作用是在堆上分配内存,同时构造一个新对象,并返回指向该对象的shared_ptr。你连续调用两次make_shared<int>(i),相当于在堆上创建了两个值为1的int对象,它们的内存地址完全不同。p1和p2各自指向其中一个对象,自然每个shared_ptr的引用计数都是1——因为它们各自管理独立的对象,没有共享。

正确的共享方式

如果要让两个shared_ptr管理同一个对象,需要用已有的shared_ptr来初始化新的shared_ptr,比如:

int i = 1;
std::shared_ptr<int> p1 = std::make_shared<int>(i);
std::shared_ptr<int> p2 = p1; // 用p1初始化p2,共享同一个对象

std::cout << p1.use_count() << std::endl; // 此时输出2

验证代码

你可以通过打印指针地址来确认对象是否相同:

#include <iostream>
#include <memory>

int main() {
    int i = 1;
    std::shared_ptr<int> p1 = std::make_shared<int>(i);
    std::shared_ptr<int> p2 = std::make_shared<int>(i);

    std::cout << "p1引用计数: " << p1.use_count() << std::endl;
    std::cout << "p2引用计数: " << p2.use_count() << std::endl;
    std::cout << "p1指向的地址: " << p1.get() << std::endl;
    std::cout << "p2指向的地址: " << p2.get() << std::endl;

    // 正确共享的情况
    std::shared_ptr<int> p3 = p1;
    std::cout << "\n创建p3后p1的引用计数: " << p1.use_count() << std::endl;
    std::cout << "p3指向的地址: " << p3.get() << std::endl;

    return 0;
}

运行后会看到p1和p2的地址不同,引用计数都是1;而p3和p1地址相同,引用计数变为2。

内容的提问来源于stack exchange,提问作者random_acct

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:42:16