在程序运行时分配的内存空间是需要在运行中释放的,这部分内存称之为堆。
智能指针不用自己释放内存,只要没有指针指向内存了,就会自动释放。下面是两种智能指针:
- shared_ptr允许多个指针指向同一个对象。使用一个计数器记录对象被多少指针指向。无论何时我们拷贝一个shared_ptr,计数器都会递增。例如,当用一个 shared_ ptr 初始化另一个shared_ ptr, 或将它作为参数传递给一个函数以及作为函数的返回值时,它所关联的计数 器就会递增。当我们给shared_ ptr赋予一个新值或是shared_ ptr被销毁(例如一个 局部的shared_ ptr 离开其作用域时),计数器就会递减。 一旦一个shared_ _ptr 的计数器变为0,它就会自动释放自己所管理的对象。
- unique_ptr则“独占”所指向的对象。
- 标准库还定义了一个名为weak_ ptr的伴随类,它是一种弱引用,指向shared ptr所管理的对象。这三种类型都定义在memory头文件中。
1. shared_ptr
shared_ptr是一个智能指针支持普通指针的很多操作,如解引用*p
。
shared_ptr是一个类,所以shared_ptr对象肯定有一些可调用的方法,如empty()方法:
#include<iostream>
#include<memory>
#include<string>
int main(int argc, char* argv[]) {
// 创建一个空string
std::shared_ptr<std::string> p1 = std::make_shared<std::string>();
// std::shared_ptr<std::string> p1 = std::make_shared<std::string>(""); // 与上面语句等价
// auto p1 = std::make_shared<std::string>("");
if(p1 && p1->empty()){
*p1 = "hello";
std::cout << *p1 << std::endl;
}
return 0;
}
p1 && p1->empty()
代表p1指向某个对象,且p1所指对象为空。- make_shared用于动态分配内存并初始化。常常使用auto定义make_shared生成的结果。
确执行,但会浪费内存。share_ ptr 在无用之后仍然保留的一种可能情况是,你将
shared_ptr存放在一一个容器中,随后重排了容器,从而不再需要某些元素。在这种情况
下,你应该确保用erase删除那些不再需要的shared_ ptr 元素。
什么叫做将shared_ ptr存放在容器中? ? ?
Note
如果你将shared_ ptr存放于一个容器中,而后不再需要全部元素,而只使
用其中一部分,要记得用erase删除不再需要的那些元素。
程序使用动态内存出于以下三种原因之一:
1.程序不知道自己需要使用多少对象
2.程序不知道所需对象的准确类型
3.程序需要在多个对象间共享数据
程序需要在多个对象间共享数据:
标签:总结,std,p1,对象,C++,shared,ptr,指针 From: https://www.cnblogs.com/codingbigdog/p/17228421.html