指针

C++智能指针

无人久伴 提交于 2020-01-06 23:00:07
智能指针的由来: 除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。 在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。 动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下就释放了它,就会产生引用非法内存的指针。 为了更加容易(更加安全)的使用动态内存,引入了智能指针的概念。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。标准库提供的两种智能指针的区别在于管理底层指针的方法不同,shared_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指向的对象。标准库还定义了一种名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象,这三种智能指针都定义在memory头文件中。 shared_ptr 共享所有权,允许多个指针指向同一个对象,其内部有一个关联的引用计数,用来记录有多少个其他的shared_ptr指向相同的对象,当引用计数为0时将调用析构函数释放对应空间。 make

指针和引用的区别

谁说胖子不能爱 提交于 2020-01-06 19:00:47
指针和引用的相同点: 1、都能提供对其他对象的间接访问 指针和引用的不同点: 1、引用并非对象,它只是为一个已经存在的对象所起的一个别名   指针本身就是一个对象,允许对指针赋值和拷贝 2、一旦定义了引用,就无法令其再绑定到另外的对象上去   指针可以先后指向几个不同的对象 3、引用定义的时候,必须赋初值   指针无须再定义的时候赋初值,在块作用域定义的指针如果没有被初始化,也将拥有一个不确定的值 来源: https://www.cnblogs.com/briskzou/p/12152076.html

Elasticsearch内存占用过高

女生的网名这么多〃 提交于 2020-01-06 17:04:18
Elasticsearch默认安装后设置的内存是1GB,对于任何一个现实业务来说,这个设置都太小了。如果你正在使用这个默认堆内存配置,你的集群配置可能会很快发生问题。 这里有两种方式修改Elasticsearch的堆内存(下面就说内存好了),最简单的一个方法就是指定ES_HEAP_SIZE环境变量。服务进程在启动时候会读取这个变量,并相应的设置堆的大小。设置命令如下: export ES_HEAP_SIZE=10g 此外,你也可以通过命令行参数的形式,在程序启动的时候把内存大小传递给它: ./bin/elasticsearch -Xmx10g -Xms10g 备注: 确保Xmx和Xms的大小是相同的,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力。 一般来说设置ES_HEAP_SIZE环境变量,比直接写-Xmx10g -Xms10g更好一点。 把内存的一半给Lucene 一个常见的问题是配置一个大内存,假设你有一个64G内存的机器,按照正常思维思考,你可能会认为把64G内存都给Elasticsearch比较好,但现实是这样吗, 越大越好? 当然,内存对于Elasticsearch来说绝对是重要的,用于更多的内存数据提供更快的操作,而且还有一个内存消耗大户-Lucene。

笔记1

╄→гoц情女王★ 提交于 2020-01-06 16:02:55
数据结构定义:我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对元素进行排序等)而执行的相应操作,这个相应的操作也叫算法。 数据结构解决存储问题 个体+个体的关系 算法解决操作问题 对存储数据的操作 衡量算法的标准 时间复杂度,空间复杂度,难易程度,健壮性 指针:指针就是地址,地址就是指针;指针变量是存放内存单元地 址的变量;指针的本质是一个操作受限的非负整数。 在这里插入代码片 int main() { int *p; int i=10; int j; j=*p; printf("i=%d,j=%d,*p=%d\n",i,j,*p); return 0; }``` 来源: CSDN 作者: LaaaaughinG 链接: https://blog.csdn.net/LaaaaughinG/article/details/103846163

利用双指针寻找链表中点

房东的猫 提交于 2020-01-06 15:51:43
利用双指针寻找链表中点 利用快慢指针(双指针)同时指向头节点,fast指针每次走两步,slow指针每次走一步,当fast指针到达链表尽头时,slow指针就处于链表中点处。 Node * middle ( Node * head ) { Node * fast , * slow ; fast = slow = head ; while ( fast != null && fast . next != null ) { fast = fast . next . next ; slow = slow . next ; return slow ; //slow即在中间位置 } 如果链表长度是奇数时,此时slow 正好为中点,如果为偶数,那么slow位置是中间偏右。 明天考试,今天写的有点少… 来源: CSDN 作者: 邜玥 链接: https://blog.csdn.net/weixin_45678985/article/details/103846425

一些常用函数:memset、memcpy、strlen、strcpy

风格不统一 提交于 2020-01-06 14:48:39
memset一般用作初始化函数。作用是将某一块内存中的内容全部设置为某一值。 格式:起始指针、设定的初始值、长度 memset ( buffer , 0 , sizeof ( int ) * 10 ) ; //在buffer处初始化10个0 memcpy用于从源内存地址的起始位置开始拷贝若干个字节到目标内存地址。 格式:返回指针,源指针、长度 memcpy ( dst , src , strlen ( src ) + 1 ) ; strlen是计算字符串长度的函数,从内存任意位置开始到’\0’为止的字符数量,一般比sizeof得到的少1。 格式:字符串指针 strlen ( str ) ; strcpy是字符串拷贝函数,把含有’\0’结束符的字符串复制到另一个地址空间。 格式:返回指针,源指针 strcpy ( dst , src ) ; 来源: CSDN 作者: 海洋之心。 链接: https://blog.csdn.net/weixin_42979679/article/details/103846996

FreeRTOS 任务栈大小确定及其溢出检测

ε祈祈猫儿з 提交于 2020-01-06 01:42:22
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的任务栈设置 不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要。 局部变量,函数调用时的现场保护和返 回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃。 裸机的情况下,用户可以在这里配置栈大小: 为什么是堆中的?因为我们采用的就是动态创建任务的方式。如果静态创建,就和我们自己开辟的空间有关,通常静态创建任务用数组作为容器,但是通常静态创建的方式我们都不使用。 FreeRTOS 的系统栈设置 上面跟大家讲解了什么是任务栈,这里的系统栈又是什么呢?裸机的情况下,凡是用到栈空间的地方 都是在这里配置的栈空间: 在 RTOS 下, 上面两个截图中设置的栈大小有了一个新的名字叫系统栈空间 ,而任务栈是不使用这里的空间的。 任务栈不使用这里的栈空间,哪里使用这里的栈空间呢?答案就在中断函数和中断嵌套。  由于 Cortex-M3 和 M4 内核具有双堆栈指针,MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP 任务堆栈指针也是可以的。在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进 程堆栈指针 PSP 是给任务栈使用的。 也就是说,在 FreeRTOS 任务中,所有栈空间的使用都是通过 PSP

链表练习题

我是研究僧i 提交于 2020-01-06 00:44:37
这段时间将会用这版面来记录一些链表的题目,脚踏实地去理解链表和使用链表。加油。(也许不是最优解,但是一定是符合题目要求的而且AC的) 1.移除链表元素 leetcode203题目:删除链表中等于给定值 val 的所有节点。 这是开始写的第一道,准备用3种方式来完成这道题目,记录自己的思路。 1.一般使用head节点完成 思路:既然是链表的删除元素,也只有next才能访问到其他元素,所以从head开始判断就好。 需要分别对head 和head.next进行判断. 其实就是遍历链表:时间复杂度O(N) public ListNode removeElements(ListNode head, int val) { //如果头节点的val就是要找的val, while(head!=null && head.val ==val ){ head = head.next; } //链表的val全是val if(head ==null){ return head; } //删除head.next位置 ListNode prev = head; while(prev.next!=null){ if(prev.next.val == val){ prev.next = prev.next.next; }else{ prev = prev.next; } } return head; } 2

PHP和MySQL Web开发读书笔记---数据的存储与检索

◇◆丶佛笑我妖孽 提交于 2020-01-05 23:53:28
为了提高自己看书的积极性,还是打算把一些笔记记录下来,也算是对自己的一种激励。 1.fopen()--------该函数有三种打开模式,分别为r(读),a(追加),w(写) 2.fwrite($fp,$outputstring)函数是向一个文件中写入$outputstring,和fputs()是一样的 3.fclose()函数关闭文件 4.feof(source $fp),即File End Of File,当指针指向了文件末尾,返回true,否则false 5.fgets($fp,999)每次从文件中读取一行,直至遇到一个换行符、或者文件结束符EOF,或者998B个字节 6.fgetss($fp,999[,allowable_tags]),会过滤掉PHP和HTML标记和allowable_tags中包含的特殊标记 7.fgetcsv($fp,10,'\t')和fgets()类似 8.读取文件的4种方式:   readfile($filename)这个函数将打开这个文件,并把文件内容输出的标准输出(即浏览器)   fpassthru($fp)这个函数需要先用fopen()打开,在把文件内容返回给标准输出,成功返回true   file()跟readfile()大致相同,不过这个函数返回一个数组,每行作为一个元素   file_get_contents()与readfile()相同

【PHP】文件写入和读取详解

自闭症网瘾萝莉.ら 提交于 2020-01-05 23:52:53
文章提纲: 一.实现文件读取和写入的基本思路 二.使用fopen方法打开文件 三.文件读取和文件写入操作 四.使用fclose方法关闭文件 五.文件指针的移动 六.Windows和UNIX下的回车和换行 一.实现文件读取和写入的基本思路: 1.通过fopen方法打开文件:$fp =fopen(/*参数,参数*/),fp为Resource类型 2.进行文件读取或者文件写入操作(这里使用的函数以1中返回的$fp作为参数) 3. 调用fclose($fp)关闭关闭文件 二:使用fopen方法打开文件 fopen(文件路径[string],打开模式[string]) <1>fopen的第一个参数为文件路径 写文件路径的方式:1绝对路径,2相对路径 1绝对路径: 在windows下工作的小伙伴们应该很熟悉,windows下的路径分隔符是“\”而不是“/”,但我们在写入路径时不能以钦定的“\”为分隔符 那如果我们以“\”分隔符写入路径会怎样呢? <?php $fp = fopen("C:\wamp64\www\text.txt",'w'); ?> 运行后报错,提示路径参数无效 所以我们要把分隔符“\”换成“/”: <?php $fp = fopen("C:/wamp64/www/text.txt",'w'); ?> 运行时无报错,说明参数是有效的。 【注意】fopen函数不能理解“\”分隔符