使用智能指针装入stl容器能自动管理资源生命周期,避免内存泄漏和重复释放。1. shared_ptr适合共享所有权,引用计数确保资源在最后使用后释放,应优先使用make_shared构造,避免循环引用;2. unique_ptr适用于独占所有权场景,性能更优,只能通过移动操作传递,不可复制;3. 容器复制时shared_ptr会增加引用计数,而unique_ptr禁止复制,扩容时两者均不会导致内存泄漏;4. 实际使用中需根据所有权需求选择合适类型,并注意深拷贝、循环引用等问题。

在使用 C++ 的 STL 容器时,如果容器中存放的是普通指针(raw pointer),很容易因为复制、释放时机不一致而导致内存泄漏或重复释放的问题。而将智能指针(如
std::shared_ptr
std::unique_ptr

STL 容器(比如
vector
map
list

用智能指针代替原始指针,可以让容器内的每个元素都自动负责资源的生命周期管理:
std::shared_ptr
std::unique_ptr
这样,即使容器被复制、元素被删除,也不用担心手动释放内存的问题。

当你希望多个地方都能持有同一个对象的所有权时,可以用
shared_ptr
std::vector<std::shared_ptr<MyClass>> vec; vec.push_back(std::make_shared<MyClass>());
几点注意事项:
make_shared
shared_ptr
举个例子,如果你有两个类互相持有对方的
shared_ptr
weak_ptr
如果你确定某个对象只能由一个容器拥有,那么应该优先使用
unique_ptr
shared_ptr
使用方式也很简单:
std::vector<std::unique_ptr<MyClass>> vec; vec.push_back(std::make_unique<MyClass>());
但要注意:
unique_ptr
比如下面这个写法是不行的:
auto copy = vec; // 编译错误!unique_ptr 不可复制
但你可以这样做:
auto movedVec = std::move(vec); // OK,移动而不是复制
当容器里放的是智能指针时,虽然不再担心内存泄漏,但有些细节还是容易忽略:
shared_ptr
shared_ptr
unique_ptr
举个实际例子:
std::vector<std::shared_ptr<int>> v; v.push_back(std::make_shared<int>(10)); auto v2 = v; // OK,引用计数变为2
此时两个容器都指向同一个
int
unique_ptr
把智能指针放进 STL 容器,说到底就是为了让资源管理更清晰、更安全。选择
shared_ptr
unique_ptr
基本上就这些,不复杂但容易忽略。
以上就是如何将智能指针用于STL容器 避免容器复制导致的内存问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号