在 C++ 中,将 shared_ptr
的 vector
插入到另一个 vector
时,shared_ptr
的所有权会发生变化。插入操作后,原始的 shared_ptr
对象所管理的资源会被转移给目标 vector
,也就是说,原始 vector
中的 shared_ptr
对象会失去对资源的所有权。
当 shared_ptr
所管理的资源引用计数降为零时,资源会被释放。因此,在将 shared_ptr
的 vector
插入到另一个 vector
后,如果原始 vector
中的 shared_ptr
对象没有其他地方持有,它们的资源将会被释放。
以下是一个示例代码,展示了如何插入 shared_ptr
的 vector
到另一个 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
使用引用计数的方式来管理资源的生命周期,在没有其他持有者时自动释放资源。