指针

报空指针的问题

一世执手 提交于 2020-03-21 19:24:16
null List list = new ArrayList(); List<StageDO> list = new ArrayList(); list使用时要实例化,否则报空指针 list.addAll(不能为空) (不能为空).equals(不能为空) 来源: https://www.cnblogs.com/wuhen8866/p/11102754.html

C++的智能指针(shared_ptr,weak_ptr)

ぐ巨炮叔叔 提交于 2020-03-21 19:04:07
一:概述 参考资料:《C++ Primer中文版 第五版》 我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。 在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。 动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下就释放了它,就会产生引用非法内存的指针。 为了更加容易(更加安全)的使用动态内存,引入了智能指针的概念。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。标准库提供的两种智能指针的区别在于管理底层指针的方法不同, shared_ptr 允许多个指针指向同一个对象。属于强引用类型,他会维护引用计数的信息,即会记录当前有多少个存活的 shared_ptrs 正持有该对象. 共享的对象会在最后一个强引用离开的时候销毁( 也可能释放). unique_ptr 则“独占”所指向的对象。 标准库还定义了一种名为 weak_ptr 的伴随类,它是一种弱引用,指向shared_ptr所管理的对象,他不控制对象生命周期,

DS博客作业02--栈和队列

…衆ロ難τιáo~ 提交于 2020-03-21 17:21:39
0.PTA得分截图 1.本周学习总结(0-4分) 1.1 总结栈和队列内容 一.栈 栈的定义 栈是一种只能在一端进行插入或删除操作的线性表,俗称:后进先出。表中允许进行插入、删除操作的一端称为栈顶。 栈的进栈出栈规则: 1.栈顶出栈->栈底最后出栈; 2.时进时出->元素未完全进栈时,即可出栈。 栈的分类: 1.顺序栈 利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针 top 指示栈顶元素在顺序栈中的位置,附设指针 base 指示栈底的位置。 同样,应该采用可以动态增长存储容量的结构。如果栈已经空了,再继续出栈操作,则发生元素下溢,如果栈满了,再继续入栈操作,则发生元素上溢。 栈底指针 base 初始为空,说明栈不存在,栈顶指针 top 初始指向 base,则说明栈空,元素入栈,则 top++,元素出栈,则 top--, 故,栈顶指针指示的位置其实是栈顶元素的下一位(不是栈顶元素的位置)。 2.链栈 其实就是链表的特殊情形,一个链表,带头结点,栈顶在表头,插入和删除(出栈和入栈)都在表头进行,也就是头插法建表和头删除元素的算法。 显然,链栈插入删除的效率较高,且能共享存储空间。 栈的基本运算 InitStack(&s):初始化栈。构造一个空栈s。 DestroyStack(&s):销毁栈。释放栈s占用的存储空间。 StackEmpty(s):判断栈是否为空

智能指针之unique_ptr

半城伤御伤魂 提交于 2020-03-21 12:53:36
概述 与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。同时,unique_ptr也没有类似于make_shared的标准库函数,当我们定义一个unique_ptr时,需要将其绑定到一个new返回的指针。因此初始化unique_ptr需要使用 直接初始化 的形式。例如: unique_ptr<double> p(new double(3.14)); // p指向一个值为3.14的double 并且,由于一个unique_ptr“拥有”(唯一指向)其指向的对象,所以unique_ptr不支持拷贝或者赋值操作: unique_ptr<string> p1(new string("southernEast")); unique_ptr<string> p2(p1); // 错误:不能拷贝 unique_ptr<string> p3; p3 = p2; // 错误:不能赋值 虽然我们不能拷贝或者赋值一个unique_ptr,但是我们能够通过使用release或reset函数来将一个非const的unique_ptr的指针所有权转移给另一个unique_ptr。例如: unique_ptr<string> p2(p1.realease()); // 将p1的指针所有权转移给p2,release将p1置空

C语言博客作业05--指针

纵然是瞬间 提交于 2020-03-21 08:20:00
1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 老师这次没布置课堂派预先作业就直接开讲,感觉上课听的不是很懂。 1.2.2 代码累计 2.PTA总分 2.1PTA中函数题目集的排名得分 2.2 我的总分 125分 3.PTA实验作业 3.1 PTA题目1 字符串的冒泡排序 3.1.1 算法分析 输入n, k \n 定义二维数组a和临时数组temp for i=0 to n do gets(a[i]) end for for i=1 to k do for j=1 to <n do if a[j-1]>a[j] then temp=a[j] a[j]=a[j-1] a[j-1]=temp end if end for end for for i=0 to <n-1 do 输出a[i] 换行 end for 输出a[n-1] 3.1.2 代码截图 3.1.3 PTA提交列表及说明 Q1:temp=a[j]编译错误 A1:字符串复制要用strcpy,不能直接用等号。 Q2:输入数组时最后一个字符串无法输入 A2:输入时在scanf里加一个回车,不然gets会得到一个回车,转为\0存入第一个字符串中。 来源: https://www.cnblogs.com/p123/p/10125206.html

计算Java对象内存大小

这一生的挚爱 提交于 2020-03-21 07:05:18
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-Klass模型等内容。最后推荐JDK自带的Hotspot Debug工具——HSDB,来查看对象在内存中的具体存在形式,以论证文中所述内容。 背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000。我们的业务系统中就使用了size为10000的15个本地缓存,所以最坏情况下将可缓存15万个对象。这会消耗掉不菲的本地堆内存,而至于实际上到底应该设多大容量的缓存、运行时这大量的本地缓存会给堆内存带来多少压力,实际占用多少内存大小,会不会有较高的缓存穿透风险,目前并不方便知悉。考虑到对缓存实际占用内存的大小能有个更直观和量化的参考,需要对运行时指定对象的内存占用进行评估和计算。 要计算Java对象占用内存的大小,首先需要了解Java对象在内存中的实际存储方式和存储格式。 另一方面,大家都了解Java对象的存储总得来说会占用JVM内存的堆内存、栈内存及方法区,但由于栈内存中存放的数据可以看做是运行时的临时数据,主要表现为本地变量、操作数、对象引用地址等。这些数据会在方法执行结束后立即回收掉

数组、字符串和指针

感情迁移 提交于 2020-03-21 01:28:33
1.如何使用数组   数组就是一组名为数组元素或简称元素的内存位置,各个内存位置可以存储相同数据类型的数据项,而我们可以用相同的变量名引用所有内存位置。 2.如何声明和初始化不同类型的数组   声明数组:例如 long height[6];   初始化数组:例如 int engine_size[5] = {200, 250, 300, 350, 400};   C++11标准定义了一种表示一组初始值的新的统一方式,对于用这种方式初始化的所有对象,这些初始值都是相同的,包括标准模板库容器和数组。   例如:int value[]{2,3,4}; 有了这种语法,=操作符就是不必要的。 3.如何对数组使用基于范围的for循环   例如: double temperatures[] = {65.5, 68.0, 75.0, 77.5, 76.4, 73.8, 80.1};       double sum = 0.0;       int count = 0;       for(double t : temperatures){         sum += t;         ++count;       }       double average = sum/count;   还可以使用auto关键字来编写该循环:     for(auto temperature :

学习vc++的第六天--微软的字符串定义

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-21 01:08:41
我把视频暂停到了 https://www.bilibili.com/video/av79302998?p=62 然后去看了关于字节处理的方式,因为我发现提取一个字符串出来要每次写#ifdef UNICODE挺麻烦的 于是乎我看了 https://www.bilibili.com/video/av38413272/?p=1 的所有字节处理 ● 窄字节: char、char * 、const char * CHAR、(PCHAR、PSTR、LPSTR)、LPCSTR ● Unicode 宽字节: wchar_t、wchar_t * 、const wchar_t * WCHAR、(PWCHAR、PWSTR、LPWSTR)、LPCWSTR ● T 通用类型: TCHAR、(TCHAR * 、PTCHAR、PTSTR、LPTSTR)、LPCTSTR LPCTSTR类型: L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。 P表示这是一个指针 C表示是一个常量 T表示在Win32环境中, 有一个_T宏 STR表示这个变量是一个字符串 记忆方法: L(长)P(指针)C(常量)T(通用)STR(字符串) 原来我们只 需要用通用类型 处理字符串就好了.

空指针RE第一次公开赛-笔记

房东的猫 提交于 2020-03-21 00:19:06
关于花指令和天堂之门 今天补了一下三月的空指针公开赛题目,没做出来,见到了一些没见过的东西,记录一下。 花指令JUMPOUT 对于这样一个花指令,call一个函数内的地址然后再retn返回,IDA会认为被call的地址是一个新的函数,当前函数就被截断了,影响到了IDA的分析,F5的话会看到这样的东西: 对于这道题,主程序中的花指令只有两种,全部nop掉(替换成0x90)就好: EB0388C3BAE8F9FFFFFF E80400000077EB07883683042401C3 天堂之门 在Windows64操作系统下,所有的32位程序会被装载到WoW64子系统中运行。而某些windows kernel调用,WoW64会将其钩取为64位调用。在这个过程中,运行的程序会从兼容模式暂时地切换成64位模式运行。利用这个特性,我们可以在程序运行过程中主动切换为64位模式来执行64位代码,以达到某种保护程序(如使静态分析失败、动态跟踪混乱)的目的。 这种保护方法被称为 Heaven‘s Gate ,直译就是”天堂之门“。 WoW64根据段寄存器cs的值来确定程序的运行模式,如果cs的值为0x33,则当前是64位模式;如果cs的值为0x23,则当前为兼容模式。 这道题采用了这样的方式来切换运行模式: xx: push 0x33 00: call loc_05 05: add [esp],6

指针运算

与世无争的帅哥 提交于 2020-03-20 16:26:37
指针只能进行加减运算。 指针的加运算递增的值取决于指针指向对象的类型。 int a=20; int* p=&a; 这里指针指向的地址假如是0x22ff44, p++以后指针指向的地址就是p+1*sizeof(int)=0x22ff48 假如指针指向数组,那么p++就相当于指向数组的下一个元素,具体指针递增的字节数看数组的类型 double a[]={1,2,3}; double* p=a; cout<<*(p+1)<<endl; *(p+1)这里指针指向数组第二个元素,然后输出数组地址的值 (p+1)=2这样就是错误的 来源: https://www.cnblogs.com/kennyMc/archive/2012/09/17/2689870.html