指针变量

C++11智能指针

萝らか妹 提交于 2020-02-07 04:17:56
C++11智能指针 为什么要使用智能指针: 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。 1.auto_ptr (c++98的方案,cpp11已经抛弃) 采用所有权模式 auto_ptr< string> p1 (new string ("I reigned lonely as a cloud.”)); auto_ptr<string> p2; p2 = p1; //auto_ptr不会报错. 此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。所以auto_ptr的缺点是:存在潜在的内存崩溃问题! 2.unique_ptr(替换auto_ptr) unique_ptr实现独占式拥有或严格拥有概念, 保证同一时间内只有一个智能指针可以指向该对象 。它对于避免资源泄露(例如“以new创建对象后因为发生异常而忘记调用delete”)特别有用 采用所有权模式,还是上面那个例子 unique_ptr<string> p3 (new string ("auto")); //#4 unique_ptr

c++ -- 多态(类)

↘锁芯ラ 提交于 2020-02-07 02:12:58
假期 2020.02 .06 学习资源来源于中国MOOC以及c语言中文网 前言 c++之所以是面向对象的是因为该语言既支持类也支持多态,而多态是什么呢? 定义 多态就是同一个操作作用于不同的对象会产生不同的结果。这个操作一般指的是函数的调用等等。 标准定义 是对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用。这种机制就叫作“多态(polymorphism)”。 虚函数 :在成员函数前加 virtual 即可生成虚函数。注意虚函数只能在类的内部定义成员函数时使用,不能在类外部写成员函数时使用,构造函数与静态成员都不能是虚函数。 多态类 :包含虚函数的类称为“多态类”。 如何构成多态 常判断条件是 有继承关系 继承关系中有同名的虚函数,并且是覆盖关系 存在基类的指针,指向派生类的虚函数,或者引用 那么什么时候声明虚函数呢? 成员函数所在的类是否是基类 成员函数在继承后是否会被新定义或者更改,是的话,需要;否则,不需要。 多态应用 举一个指针类型的例子: 注意:多态的语句调用哪个类的成员函数是在运行时才能确定的,编译时不能确定。多态的函数调用语句被称为是“动态联编”

c语言 局部变量做返回值 问题

倖福魔咒の 提交于 2020-02-07 01:10:19
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说, 函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明: 1: [cpp] view plain copy #include <stdio.h> char *returnStr() { char *p= "hello world!" ; return p; } int main() { char *str; str=returnStr(); printf( "%s\n" , str); return 0; } 这个没有任何问题,因为"hello world!"是一个字符串常量,存放在 只读数据段 ,把该字符串常量存放的 只读数据段 的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。 2: [html] view plain copy #include < stdio.h >

函数返回局部变量的几种情况

。_饼干妹妹 提交于 2020-02-07 01:04:33
转载 http://blog.csdn.net/haiwil/article/details/6691854/ 本文主要详细讨论了返回返回局部变量的几种情况,值得大家注意。 一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明: 1: [cpp] view plain copy #include <stdio.h> char *returnStr() { char *p= "hello world!"; return p; } int main() { char *str; str=returnStr(); printf( "%s\n", str); return 0; } 这个没有任何问题,因为"hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时

C#指针和不安全代码

大憨熊 提交于 2020-02-06 07:23:35
C#指针和不安全代码 一、引言 C#非常擅长对开发人员隐藏大部分的基本内存管理,因为它使用了垃圾回收器和引用。但是有时我们需要对一些内存进行访问那么该怎么办?我们可以用C#中的指针。 C#中也是有指针。指针的操作效率虽然高但是不安全。因为我们可以通过地址的操作来修改内存中的一些数据,而这些内存可能被别的程序使用。这样就有可能造成一定的隐患。 例如: int i =100; int* pt=&i; //将i的地址取出赋值给pt指针。 *(pt+1)=100; //将pt指针的地址加上1后,将此地址的内容赋值为100. 问题就在第三段,因为pt原先是指向i的,i是程序申请的变量空间,所有合法,但是将pt+1的执行的内存不一定是合法的,所以赋值100有可能会出现错误。 也正是因为指针的不安全性,所以在C#中不经常用指针。而是用引用来代替指针。 C#的引用其实就是一个类型安全的指针。 既然指针不安全为什么还要使用它呢? 1、向后兼容性。 许多的外部工具或其他语言编写的Dll中很多都会用到以指针作为参数来传递。为了适应这些要求,有时不得不用到指针。 2、性能 不得不说,由于指针是直接指向内存的,所以它的效率非常的高。所以在对性能、速度要求很高的场合可以考虑用指针。当然如果有更安全的解决方法,就尽量不使用指针。 二、unsafe关键字 使用指针需要注意什么? 因为指针是不安全的

C++Primer 变量和基本类型

北城余情 提交于 2020-02-06 07:05:32
还是从最基础的来看吧,简单的大概看一下吧。 char是8位类型,最多只能包含256种字符,许多外文 字符集 所含的字符数目超过256个,char型无法表示。如中文字符,就可用 wchar_t来表示 Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。能够使计算机实现跨语言、 跨平台 的文本 转换 及处理。 void* 指针 可用于存放任意对象的地址 作用:拿它与其他类型的指针比较、作为函数的输入或输出、赋给另一个void*指针 不能直接操作void*指向的对象 指向指针的引用 引用本身不是一个对象,因此不能定义指向引用的指针,但是指针是对象,存在对指针的引用 r到底是什么? 最简单的方法是从右向左阅读r的定义。离变量最近的符号对变量的类型个有最直接的影响。 所以,在此例中,r是一个引用。r引用的是一个int指针。 const与指针中,用名词顶层const 表示指针本身是个常量,而用底层const表示指针所指的对象是一个常量。 constexpr和常量表达式 常量表达式——值不会改变并且在编译过程中就能得到计算结果的表达式。用常量表达式初始化的const对象也是常量表达式。 constexpr变量 允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

2.4:const限定符

独自空忆成欢 提交于 2020-02-06 05:26:41
这是个好东西,Effective C++里都已说过:能用的地方尽量用,大师都这样说了,我们这些渣渣为何不遵循? const就是常量,这就有个重要的东西了: 常量必须初始化   const int a = 0;   const int b = get_size();   //已知有get_size()函数   const int c;        //错误!!! ---------------------------------------------------------------------------------------------------------------   int m = 42;   const int n = m; --------------------------------------------------------------------------------------------------------------- 对const对象的任何修改都会导致错误。   const a = 0;   a = 1;       //错误!! ==============================分割线============================== 默认状态下,const对象仅在文件内有效 当定义一个const对象时

指针

て烟熏妆下的殇ゞ 提交于 2020-02-06 05:21:39
指针(Point) 说到指针,首先要知道什么是指针,那么什么是指针呢? 在计算机中,指针是编程语言中的一个对象,利用地址,它的值是直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 那么什么是变量呢? 变量通俗的来说就是能变化数。从本质上说就是在内存当中某一个进程里的一个临时存储区域。其作用是用于存储一些计算当中产生的一些临时性数据。在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性。 每一个变量空间在创建的时候都会被随机的分配地址,这个地址是个真实的物理内存地址,变量空间中的数据在变化的过程中必须保持是可兼容的,至少是同一类型。否则就会存在错误。 如果直接在代码中用变量的物理地址去访问空间中的数据的话 ,就有可能访问不到。因此为了避免地址的不确定性,引入了变量名这个概念 由变量名-地址表 来保证变量名和变量之间的关系(底层实现)。这样保证其正确性。 我们说的变量空间的地址, 其实就是C语言当中学的指针。 举个例子简单的说明下: 其中*c的含义是返回c 的值作为地址的那个空间的取值。&b的意义是返回当时声明b时开辟的地址。显然可以用赋值语句对内存地址赋值。具体说明如下: #include<stdio.h> void

const in C/C++

↘锁芯ラ 提交于 2020-02-06 04:53:33
1. const 对象必须初始化,因为一旦创建后值不能改变。 Eg :   const int i = GetSize(); // 正确 : 运行时初始化   const int j = 42; // 正确:编译时初始化   j = 33; // 错误:试图向 const 对象写值   const int k; // 错误: k 是一个未经初始化的常量 2.默认状态下, const 对象仅在文件内有效。 若想在多个文件内工作,只在一个文件中定义 const ,而在其他多个文件中声明并使用它。 解决办法,对于 const 变量,不论声明定义都加 extern ,这样只需定义一次即可。 Eg :   //file1.cc 定义并初始化一个常量,该常量能被其他文件访问   Extern const int bufSize = fcn();   //file1.h   Extern const int bufSize; // 与 file1.cc 中定义的 bufSize 是同一个 3.把引用绑定到 const 对象上,称之为 对常量的引用 Eg1 :   const int c = 1024;    const int &r1 = c; // 正确   r1 = 42; // 错误: r1 是对常量的引用   int &r2 = c; // 错误:试图让一个非常量引用指向一个常量引用

2.4 const限定符

随声附和 提交于 2020-02-06 04:52:34
#因为const对象一旦创建后其值就不能被改变,因此const对象必须初始化 默认状态下,const对象仅在文件内有效..... #编译器会在编译过程把用到const变量的地方替换成起对应的值 #如果我们想要只在一个文件中定义const对象,而在多个文件中使用它(多文件间共享const对象) 解决办法是:对于const变量不管是在定义还是声明都添加extern关键字,这样只需定义一次即可 2.4.1 const的引用(常量引用) 初始化和const的引用 对const的引用可以引用一个非const的对象(常量引用对象的值不能被改变,但并不代表常量引用所引用对象的值是不能被改变的) 2.4.2 指针和const 想要存放常量对象的地址,只能使用指向常量的指针 和常量引用一样,指向常量的指针也没有规定其所指向的对象必须是一个常量 const指针(常量指针) 常量指针必须初始化,并且一旦赋值后,其值就不能再改变(也就是存放在指针中的地址不能改变) 把*放在const关键字之前,说明指针是一个常量 2.4.3 顶层const 顶层const:表示指针是一个常量(即常量指针) 底层const:表示指针指向的值是一个常量 2.4.4 constexpr和常量表达式 常量表达式:是指值不会改变并且能够在编译时计算出结果的表达式 constexpr变量 C++11标准规定