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

2023-12-25 14:44:42

在 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 使用引用计数的方式来管理资源的生命周期,在没有其他持有者时自动释放资源。

文章来源:https://blog.csdn.net/qq_36541069/article/details/135198300
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。