unique_ptr与C++标准库容器结合可实现自动资源管理,确保对象在容器销毁或元素移除时被正确释放,避免内存泄漏。其核心优势包括:遵循RAII原则,强制独占所有权,防止拷贝导致的双重释放错误;与std::move配合支持安全高效的资源转移;与容器无缝集成,简化异常安全处理。使用时需注意:不可拷贝unique_ptr,必须用std::move转移所有权;访问元素应通过引用或get()获取裸指针;若用于多态类型,基类必须有虚析构函数以防析构不全;优先使用std::make_unique创建对象以保证异常安全和性能。相比shared_ptr,unique_ptr无引用计数开销,更轻量高效,适用于容器为唯一所有者的场景;而shared_ptr适合需共享所有权的情况,但有性能代价和循环引用风险。因此,应默认选用unique_ptr,仅在明确需要共享时才使用shared_ptr。

将
unique_ptr
在C++编程中,当我们需要在容器中存储动态分配的对象时,传统的裸指针管理起来常常是个噩梦。忘记
delete
unique_ptr
unique_ptr
unique_ptr
unique_ptr
std::vector
std::list
std::map
unique_ptr
想象一下,你有一个
std::vector<MyObject*>
new MyObject()
vector
delete
MyObject*
现在,如果使用
std::vector<std::unique_ptr<MyObject>>
vector
unique_ptr
std::make_unique
std::move
vector
立即学习“C++免费学习笔记(深入)”;
#include <vector>
#include <memory>
#include <iostream>
#include <string>
class MyResource {
public:
std::string name;
MyResource(std::string n) : name(std::move(n)) {
std::cout << "MyResource '" << name << "' constructed." << std::endl;
}
~MyResource() {
std::cout << "MyResource '" << name << "' destructed." << std::endl;
}
void doSomething() const {
std::cout << "MyResource '" << name << "' doing something." << std::endl;
}
};
int main() {
std::vector<std::unique_ptr<MyResource>> resources;
// 添加元素,使用 make_unique 更安全高效
resources.push_back(std::make_unique<MyResource>("Resource A"));
resources.emplace_back(std::make_unique<MyResource>("Resource B")); // emplace_back 可以直接构造 unique_ptr
// 也可以直接用裸指针构造 unique_ptr 并移动,但不推荐裸 new
resources.push_back(std::unique_ptr<MyResource>(new MyResource("Resource C")));
// 访问元素
if (!resources.empty()) {
resources[0]->doSomething();
}
// 移除一个元素并转移所有权
// unique_ptr不能被拷贝,只能被移动
if (resources.size() > 1) {
std::unique_ptr<MyResource> extracted_resource = std::move(resources[1]); // Resource B 的所有权被转移
// 此时 resources[1] 变为空(nullptr),但 vector 元素个数不变
// 如果想从 vector 中真正移除,需要结合 erase 或 pop_back
resources.erase(resources.begin() + 1); // 移除第二个元素(原 Resource B 的位置)
std::cout << "Extracted resource name: " << extracted_resource->name << std::endl;
// extracted_resource 会在 main 函数结束时销毁 Resource B
}
// 当 resources 向量超出作用域时,MyResource 'Resource A' 和 'Resource C' 会自动销毁
std::cout << "Exiting main scope." << std::endl;
return 0;
}这段代码清晰地展示了
unique_ptr
resources
unique_ptr
unique_ptr
unique_ptr
当我们需要在容器中存储动态创建的对象时,
unique_ptr
unique_ptr
delete
更深一层看,
unique_ptr
std::vector<std::unique_ptr<T>>
T
此外,
unique_ptr
std::move
std::move
unique_ptr
虽然
unique_ptr
unique_ptr
unique_ptr
unique_ptr
unique_ptr
unique_ptr
std::move
JTopCMS基于JavaEE自主研发,是用于管理站群内容的国产开源软件(CMS),能高效便捷地进行内容采编,审核,模板制作,用户交互以及文件等资源的维护。安全,稳定,易扩展,支持国产中间件及数据库,适合建设政府,教育以及企事业单位的站群系统。 系统特色 1. 基于 JAVA 标准自主研发,支持主流国产信创环境,国产数据库以及国产中间件。安全,稳定,经过多次政务与企事业单位项目长期检验,顺利通过
0
例如,如果你想从
std::vector<std::unique_ptr<MyResource>>
unique_ptr
// 假设 resources 非空 std::unique_ptr<MyResource> extracted_resource = std::move(resources[0]); // 此时,resources[0]变为空(nullptr),其原有的MyResource对象现在由extracted_resource管理。 // 如果要从 vector 中移除这个空洞,可能需要 resources.erase(resources.begin());
如果只是想访问元素而不转移所有权,就使用引用:
MyResource& ref_to_resource = *resources[0]; // 或者 MyResource* raw_ptr_to_resource = resources[0].get(); // 获取裸指针,但不拥有所有权
另一个常见但容易被忽视的情况是,当容器中存储的是基类的
unique_ptr
virtual
unique_ptr
unique_ptr
最佳实践:
std::make_unique
std::make_unique
unique_ptr
unique_ptr
shared_ptr
unique_ptr
std::move
unique_ptr
unique_ptr
unique_ptr
std::unique_ptr<BaseClass>
DerivedClass
BaseClass
unique_ptr
shared_ptr
在C++中,除了
unique_ptr
shared_ptr
weak_ptr
unique_ptr
unique_ptr
unique_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
选择建议:
unique_ptr
unique_ptr
shared_ptr
shared_ptr
weak_ptr
weak_ptr
weak_ptr
shared_ptr
shared_ptr
以上就是C++unique_ptr与容器结合高效管理资源的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号