管理同一对象时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
相关产品推荐
相关产品推荐

