首页 > 编程语言 >C++指针总结

C++指针总结

时间:2023-03-17 22:23:43浏览次数:39  
标签:总结 std p1 对象 C++ shared ptr 指针

在程序运行时分配的内存空间是需要在运行中释放的,这部分内存称之为堆。

智能指针不用自己释放内存,只要没有指针指向内存了,就会自动释放。下面是两种智能指针:

  • 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

相关文章

  • c++ mutex operations try_lock,un_lock
    //model/util.h#pragmaonce#include<chrono>#include<ctime>#include<fstream>#include<functional>#include<iomanip>#include<iostream>#include<list>......
  • 2023/3/17 做题技巧总结
    T1对于一道题目,如果描述有类似于“对于\(\forallx,y\in\mathbb{S}\)都有\(x\oplusy\in\mathbb{S}\)(其中\(\oplus\)为任意满足交换律的运算)”的描述时,我......
  • 3.17学习总结
    今天将地铁查询系统写完了,所有功能都可实现,我们参考了网上的表结构,将算法优化了一下,所有功能都可使用。     ......
  • 每日总结-23.3.17
    今天写了打卡关于记录和检测连续打卡时长的代码packagecom.example.daka1;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.Intent;impo......
  • 个人所最偏爱的“游戏的表达”的思考和总结
    思维导图,个人比较喜欢用MindMaster这个思维导图软件,所以会使用这个软件,来整理思绪。《游戏改变世界》中一些个人最为关注的观点个人的话,还是更喜欢,童话,卡通,童真类型的,......
  • 每日总结 3.17
    今天完成了web课程的实验报告一后,继续对查询线路的显示进行了优化处理。页面不会在查询之前显示null,使用foreach进行集合遍历。<%@pagelanguage="java"contentType="......
  • 今日总结
    今天我们讨论了该如何快速遍历地铁的所有车站,由于地铁图过于复杂,再加上今天课很多,因此我们目前还没有商量出结果,根据网上内容,我推测出要使用欧拉回路算法,这部分算法对我们......
  • 3.17学习总结
    今天上web课上机实验学会了网页html的制作实验代码如下<!DOCTYPE html><html>    <head>        <title>信2105-3尹亚博个人主页</title>      ......
  • 关于C# Method.Invoke方式调用C++ COM
    折腾了两天,最终发现,无法实现。微软文档有说明:注解此方法用于从非托管代码访问托管类,不应从托管代码调用。有关详细信息,请参阅 IDispatch::Invoke。 MethodBase......
  • 3.17 总结
    前言:废掉了T1.线性代数考场时想到了线性基,但是思路仅从基底入手,没想到如何维护这个基的最大值小于\(n\)。题解:容易想到线性代数,相当于就是求任意元素小于\(n\)的......