1.空指针和野指针 http://blog.csdn.net/fu_zk/article/details/21030607 空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1(它们都是值为0的整数常量表达式)以及(void)0.void NULL 都是空指针常量,空指针常量可以赋值给任何指针类型,因为它是变体类型(void*).但是我们更倾向于使用NULL表示这个空指针常量.对于其它方式(比如0)来表示空指针常量虽然不会产生任何问题,但是在根本意义上并不符合空指针常量的定…
首先,C++标准规定:delete空指针是合法的,没有副作用.但是,delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址. 问题来了,对一个非空指针delete后,若没有赋NULL,若再次delete的话,有可能出现问题.如下代码 int *p = new int(3); delete p; delete p; 用VC编译运行将出现问题.将其改为: int *p = new int(3); delete p; p = NULL; de…
2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在的问题.其最大的特点在于保持较高的运行效率.深入的底层控制和广泛应用范围的同时,解决了传统C语言和C++语言中的内存安全问题.2009年,Mozilla接手Rust项目,创建了以Graydon为首的专业全职开发团队,并且开放了该项目的源代码.2012年1月,第一个面向公众的预览版本——v0.1 发布…
delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址 delete NULL编译器不会报错(因为delete空指针是合法的) 例: 对一个非空指针delete后,若没有赋NULL,若再次delete的话,有可能出现问题. 如下代码 int *p = new int(3); delete p; delete p; 用VC编译运行将出现问题. 将其改为: int *p = new int(3); delete p; p = NULL; d…
指针变量的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址, 决不能赋予任何其它数据,否则将引起错误.在C语言中, 变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址. C语言中提供了地址运算符&来表示变量的地址.其一般形式为: & 变量名: 如&a变示变量a的地址,&b表示变量b的地址. 变量本身必须预先说明.设有指向整型变量的指针变量p…
指针悬挂: 问题:使用new申请的内存内存空间无法访问,也无法释放. 原因:直接对指向new申请的存储空间的指针变量进行赋值修改 后果:失去了原来的地址,原来的空间无法访问也无法释放,造成内存泄漏 还可能造成同一个内存释放两次 容易引起指针悬挂的方式:对象的初始化和对象间赋值 容易引起指针悬挂的条件:类中含有指针类型的成员时,使用默认的拷贝构造函数和赋值函数都会出现两个指针变量互相赋值,产生指针悬挂的问题. 解决方法:需要重新定义拷贝构造函数和超载赋值运算符 赋值操作符: 作用:两个已经存在的对…
问题 在有一次尝试用stat()函数获取文件属性的时候,发现如果直接声明一个指针,然后把这个指针作为参数传给函数,会导致函数执行失败,原代码: #include <sys/stat.h> #include <unistd.h> #include <stdio.h> int main(void) { struct stat *sta_1; char pth_1[] = "./c12.txt"; int re = stat(pth_1, sta_1);…
错误的代码: 错误的结果:  错误原因分析: 在使用(1) 将pB,pC的值赋给pA的lchild和rchild时: 还未给指针变量pB和pC赋值,现在pB和pC中存的是个垃圾值 Note: (2)->(3)时,才对pB 赋值 总结: 在还未给指针变量正确赋值的情况下,就使用它的值 这就相当于: int a; int b = a; int a = 3; 此时b中的值肯定不是a中的值3 正确的代码: 正确的结果:…
C++指针之间的赋值与转换规则总结 Note:以下结论不适用于类的成员函数指针,关于类的成员函数指针会单独讨论. 一.任何类型的指针变量均可直接赋值给const void * 任何类型的非const指针变量均可直接赋值给void *  const指针变量不可直接赋值给void *,除非通过强制类型转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36…
1.      引用本身是有指针实现的:引用为只读指针 例子: int d=123; int& e=d;    //引用 int * const e=d; //只读指针,e指向d,不可修改e指向别的变量 2.      const修饰指针问题 2.1.指向const对象的指针: const double *cptr; const 所限定的是指针所指的对象,而非限定指针为const 例子: const double ip=3.14;   //ip为const型 const double *cptr…