指针

智能指针scoped_ptr

强颜欢笑 提交于 2020-03-04 16:50:31
对应C++11中的 unique_ptr #include <iostream> #include <memory> class foo { public: foo() { std::cout<<"constructor"<<std::endl;} ~foo() { std::cout<<"destructor"<<std::endl; } void doit() { std::cout<<"do"<<std::endl; } }; int main() { std::unique_ptr<foo> sf(new foo); sf->doit(); (*sf).doit(); sf.reset(new foo); sf->doit(); return 0; }    scoped_ptr的所有权更加严格,不允许转让,对其赋值和拷贝都是不合法行为,因而显得更轻巧和快捷。 scoped_ptr重载了operator*()和operator->()解引用操作符*和箭头操作符->,因此可以把scoped_ptr对象如同指针一样使用。如果scoped_ptr保存的空指针,那么这两个操作的行为未定义。 scoped_ptr不能在两个scoped_ptr之间、scoped_ptr与原始指针之间或空指针之间进行了相等或不相等测试。operator ==和operator !=都被声明为私有。

智能指针学习笔记

寵の児 提交于 2020-03-04 16:43:02
智能指针学习笔记 本文介绍智能指针的使用。智能指针是c++ 中管理资源的一种方式,用智能指针管理资源,不必担心资源泄露,将c++ 程序员 从指针和内存管理中解脱出来,再者,这也是c++发展的趋势(这话不是我说的,见《Effective c++》和《c++实践编程》),应该认真学习一下。 智能指针中,最有名的应该数auto_ptr,该智能指针已经被纳入标准库,只需要包含<memory>头文件即可以使用,另外,TR1文档定义的shared_ptr和weak_ptr也已经实现(我用的gcc版本是gcc 4.6.1),它们的头文件是<tr1/memory> 。除此之外,还有几个好用的智能指针,不过它们属于boost库,不属于STL ,所以,用不用得到,根据自己的需要。不过,了解一下总无妨,正所谓”功不唐捐”嘛。 下面分别介绍auto_ptr,scoped_ptr,scoped_array,shared_ptr,shared_array, weak_ptr 和 intrusive_ptr 。 ##2. auto_ptr ###2.1 为什么要用智能指针 在介绍第一个智能指针之前,先介绍下为什么要使用智能指针。先看下面这个函数: void f() { classA* ptr = new classA; // create an object explicitly ... // perform

初识boost之boost::share_ptr用法

夙愿已清 提交于 2020-03-04 16:34:29
boost中提供了几种智能指针方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而标准库中提供的智能指针为auto_ptr. 这其中,我最喜欢,使用最多的是shared_ptr,也最让人随心所欲. 使用很简单,如下: 头文件 <boost/shared_ptr.hpp> class A { virtual void process(); } boost::shared_ptr<A> test(new A); boost::shared_ptr通过重载->(返回传入的指针),test的使用就如同一个指针。其实test是一个对象。 当发生引用时,boost::shared_ptr<A> test1 = test; test1与test共享构造的A指针,引用计算加一。当析够发生时,计算器减一,当计数器为0,删除内嵌指针。 常用的boost::shared_ptr函数有: get() 获取裸指针 reset() 计数器减一 另外,boost::shared_ptr可以方便的和std::vector配合,除了不用担心节点的野指针等问题,还有一个比较有意思的功能。 class B : public A { virtual void process(); void do(); } std::vector< boost::shared_ptr<A> >

Boost智能指针——shared_ptr

梦想的初衷 提交于 2020-03-04 16:32:25
boost::scoped_ptr 虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而 boost::shared_ptr 可以解决这一局限。顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法: #include <string> #include <iostream> #include <boost/shared_ptr.hpp> class implementation { public : ~implementation() { std::cout << "destroying implementation\n" ; } void do_something() { std::cout << "did something\n" ; } }; void test() { boost::shared_ptr<implementation> sp1( new implementation()); std::cout<< "The Sample now has " <<sp1.use_count()<< " references\n" ; boost::shared_ptr<implementation> sp2 = sp1; std::cout<< "The Sample now has " <<sp2.use

链表的创建、遍历、删除、插入和清空

十年热恋 提交于 2020-03-04 16:19:25
一、链表的概念   链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 二、链表和数组的区别: 1、数组静态分配内存,链表动态分配内存。 2、数组在内存中是连续的,链表是不连续的。 3、数组利用下标定位,查找的时间复杂度是O(1),链表通过遍历定位元素,查找的时间复杂度是O(N)。 4、数组插入和删除需要移动其他元素,时间复杂度是O(N),链表的插入或删除不需要移动其他元素,时间复杂度是O(1)。 数组的优点 1、随机访问性比较强,可以通过下标进行快速定位。 2、查找速度快 数组的缺点 1、插入和删除的效率低,需要移动其他元素。 2、会造成内存的浪费,因为内存是连续的,所以在申请数组的时候就必须规定七内存的大小,如果不合适,就会造成内存的浪费。 3、内存空间要求高,创建一个数组,必须要有足够的连续内存空间。 4、数组的大小是固定的,在创建数组的时候就已经规定好,不能动态拓展。 链表的优点 1、插入和删除的效率高,只需要改变指针的指向就可以进行插入和删除。 2、内存利用率高,不会浪费内存,可以使用内存中细小的不连续的空间,只有在需要的时候才去创建空间。大小不固定,拓展很灵活。 链表的缺点 查找的效率低,因为链表是从第一个节点向后遍历查找。 单链表和双链表 三、链表环问题 判断是否有环    定义一个快指针和一个慢指针

给定一个链表,判断链表中是否有环(Java实现)

守給你的承諾、 提交于 2020-03-04 14:38:40
public class LinkedList { //给定一个链表,判断链表中是否有环 class ListNode { int val ; ListNode next ; ListNode ( int x ) { val = x ; } } public boolean hasCycle ( ListNode head ) { //先判断链表是否合法 if ( head == null ) { return false ; } //快慢指针法,创建两个指针,快指针 fast 一次走两步,慢指针 slow 一次走一步,如果相遇,表示有环,否则无环 ListNode fast = head ; ListNode slow = head ; while ( fast != null && fast . next != null ) { fast = fast . next . next ; slow = slow . next ; if ( fast == slow ) { return true ; } } return false ; } } 来源: CSDN 作者: JIAYU. 链接: https://blog.csdn.net/qq_45914985/article/details/104650636

C++数组指针不能自增1/自减1

和自甴很熟 提交于 2020-03-04 12:27:08
我们知道指针可以自增1/自减1,如下面这个代码是没问题的 int *var; var++; 但如果var是指向数组的指针,那么var++是非法的,如下面例子 #include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { *var = i; // 这是正确的语法 var++; // 这是不正确的 } return 0; } 把指针运算符 * 应用到 var 上是完全可以的,但修改 var 的值是非法的。这是因为 var 是一个指向数组开头的常量,不能作为左值。var++会修改var的地址,但var 只能是指向数组第一个元素的指针,不能修改。 但是下面代码是允许的 *(var + 2) = 500; 来源: CSDN 作者: Mr.Jcak 链接: https://blog.csdn.net/weixin_38314865/article/details/104648702

malloc

半世苍凉 提交于 2020-03-04 08:16:13
malloc函数是一种分配长度为num_bytes字节的内存块的函数,可以向系统申请分配指定size个字节的内存空间。中文为动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。 malloc函数原型 extern void *malloc(unsigned int num_bytes); malloc函数头文件 #include <stdlib.h> 或 #include <malloc.h> malloc函数函数声明 void *malloc(size_t size); void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据。 malloc函数返回值 如果分配 成功 则返回 指向被分配内存的指针 (此存储区中的初始值不确定), 失败 返回 空指针NULL 。当内存不再使用时,应使用 free()函数 将内存块释放。 malloc函数与new的区别 从本质上来说: malloc ( Linux上具体实现可以参考man malloc,glibc通过brk()&mmap()实现 )是libc里面实现的 一个函数 。 如果在source code中没有直接或者间接include<stdlib.h>,那么gcc就会报出error:‘malloc’ was not

char *p;sizeof(p)=?

一世执手 提交于 2020-03-04 07:51:25
sizeof(指针)是指针变量占用内存的大小(字节数),而指针是存储变量地址的,变量地址的长度即为指针变量所占内存大小,尽管不同类型变量所占内存大小不同(int四字节、char一字节),但指针存的只是首字节地址,不同的是指针递增时,增加的地址。 所以在32位机上,所有指针类型变量占用内存字节数都为4 因为32位机就是 4字节 * 8个二进制位/字节 计算出来的. 如果在64位机上,指针占用内存大小就是8个字节. 也有一种说法,指针是存变量地址,变量地址的长度与编译时使用的编译器有关,一般VS是win32,即32位,所以指针长度一般位4字节(4*8) # include <iostream> using namespace std ; int main ( ) { char c ; char * pc = & c ; int a ; int * pa = & a ; cout << sizeof ( c ) << "\t" << sizeof ( pc ) << "\t" << ( void * ) pc << "\t" ; pc ++ ; cout << ( void * ) pc << endl ; cout << sizeof ( a ) << "\t" << sizeof ( pa ) << "\t" << pa << "\t" << pa ++ << endl ;

第六周作业

♀尐吖头ヾ 提交于 2020-03-04 07:25:42
这次作业属于那个课程 C语言程序设计 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/2889 我在这个课程的目标是 理解变量、内存单元和地址之间的关系;掌握如何使用指针变量;掌握指针变量的基本运算;理解指针作为函数参数的作用;掌握如何使用指针实现函数调用返回多个值 这个作业在那个具体方面帮助我实现目标 正确使用字符串 参考文献 C语言程序设计 一、本周完成的作业: 求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double *a, double *b); 其中 a 和 b 是用户传入的参数。函数求 a 指针和 b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0;