c++ 关于共享指针在数组中的所有权转移

在 C++ 中,将 shared_ptrvector 插入到另一个 vector 时,shared_ptr 的所有权会发生变化。插入操作后,原始的 shared_ptr 对象所管理的资源会被转移给目标 vector,也就是说,原始 vector 中的 shared_ptr 对象会失去对资源的所有权。

shared_ptr 所管理的资源引用计数降为零时,资源会被释放。因此,在将 shared_ptrvector 插入到另一个 vector 后,如果原始 vector 中的 shared_ptr 对象没有其他地方持有,它们的资源将会被释放。

以下是一个示例代码,展示了如何插入 shared_ptrvector 到另一个 vector 并释放资源:

#include <iostream>
#include <vector>
#include <memory>

struct MyObject {
    int value;

    MyObject(int val) : value(val) {
        std::cout << "Constructing MyObject: " << value << std::endl;
    }

    ~MyObject() {
        std::cout << "Destructing MyObject: " << value << std::endl;
    }
};

int main() {
    std::vector<std::shared_ptr<MyObject>> source;

    // 在源 vector 中插入 shared_ptr 对象
    source.push_back(std::make_shared<MyObject>(1));
    source.push_back(std::make_shared<MyObject>(2));
    source.push_back(std::make_shared<MyObject>(3));

    std::vector<std::shared_ptr<MyObject>> destination;

    // 将源 vector 插入到目标 vector
    destination.insert(destination.end(), source.begin(), source.end());

    // 输出目标 vector 的元素数量
    std::cout << "Destination vector size: " << destination.size() << std::endl;

    // 清空源 vector
    source.clear();

    // 输出目标 vector 的元素数量
    std::cout << "Destination vector size after clearing source: " << destination.size() << std::endl;

    // 目标 vector 中 shared_ptr 对象的资源会在此处释放

    return 0;
}

运行以上代码,你将看到输出的结果是:

Constructing MyObject: 1
Constructing MyObject: 2
Constructing MyObject: 3
Destination vector size: 3
Destination vector size after clearing source: 3
Destructing MyObject: 1
Destructing MyObject: 2
Destructing MyObject: 3

可以看到,在清空源 vector 后,目标 vector 仍然保留了原始 shared_ptr 的资源,并正常进行了释放。这是因为 shared_ptr 使用引用计数的方式来管理资源的生命周期,在没有其他持有者时自动释放资源。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值