if(NULL != p)和f(p != NULL)两者并没什么区别,都是判断指针p是否为空。
但是当考虑到出错检查时,if(NULL != p)写法更好,因为如果误写为if(NULL = p)的时候,编译器就会提示出错(因为常量不能被赋值);而if(p != NULL)如果误写为if(p = NULL),则编译器不会报错
P=NUL也错了,应该是P=NULL;。成功声明的指针p,经p=NULL;后,p的值确实是0,但规定不是指向0单元的意思,而是表示这个指针p为不能使用的无效指针。这可以这么验证,用p取地址为0的单元里的值就是连编译都不会让过的非法操作。
P不会等于NULL。
在C++中,如果动态分配内存空间不足,会抛出 std::bad_alloc 类型的异常。
也就是说程序的执行流程上来说,不会从new调用返回,也就不存在返回值是NULL这么一说了。
如果你要它失败的时候返回NULL,可以这样写
int P = new(std::nothrow) int[10];
if (p == NULL)
该操作功能为如果p非空,则释放p指向的内存。
delete 是C++中的关键字,其功能为释放内存,与之对应的是new关键字。
new关键字可以申请一个单位空间,如
int p = new int;
是申请一个大小为int型所占空间大小的内存,并把首地址赋值给指针p。
当使用后要释放时,需要调用
delete p;
new关键字还可以申请一组空间,如
int p = new int [10];
申请一组10个int型的空间,并赋值给指针p。
这种情况下要释放时需要调用
delete [] p;
这种就是本题中所描述的情况。
至于if(p)这种写法是从C中继承来的。C中使用的分配空间函数为malloc,释放空间函数为free
当调用free且参数为空指针(NULL)时,程序会崩溃,所以在释放的时候一般用
if(p)free(p);来做保护。即只有p非空时才释放。
而C++的delete关键字对此已经做了优化,当参数p为NULL时将不会报错,同时也不会做任何操作。所以在这里的if(p)实际上已经没有必要。只不过在使用C的free函数习惯后,或者不了解delete的新特性的编程人员,还是会加上if(p)来做保护。
外面的判断是为了防止不必要地操作mutex,里面的判断是为了防止多次实例化。
外面的判断是出于性能优化(非必须),而里面的判断是出于只实例化一次的保证(必须的)
回顾下代码:
if (p == NULL)
{
pthread_mutex_lock(&mutex);
if (p==NULL)
p = new singleton();
pthread_mutex_unlock(&mutex);
}两个mutex中间是临界区,是保证同时最多只有一个线程的。
外面的p==NULL在临界区外;这时,如果删掉了里面的p==NULL,在下面的情形下,就会发生内存泄漏:
线程A判断p==NULL为真
线程B判断p==NULL为真
线程A进入临界区
线程A实例化p
线程A退出临界区
线程B进入临界区
线程B实例化p
线程B退出临界区
所以,里面的p==NULL在多线程环境下是必要的。
外面的p==NULL虽然不必要,删掉它依然可以保证只p实例化一次,但他可以在p已经实例化后避免线程再进入临界区,提升性能。
new之后你会得到一块地盘(内存空间),里面的内容随你改,其他程序不得动用。
free(p) 后P指向的那块地不再归你使用,里面的内容不一定变化,但是P还是指着那不动。
单纯的p==NULL的话,P指向0,那块地还是归你使用,其他程序不得动用,但是你再也找不到那块地了,这就是内存泄露。
第一题
a、p是一个地址,你可以说p=&x,但不能说a=x,a不对
b、p是指向一个变量地址的指针,而x是int型,b不对
c、c是对的,这是指针的初始化。
d、int p;p=null;该句代码的意思是p指向的内存赋值为NULL,这不是合法的内存,d不对。
第二题
在c语言中null与0相对应,因此,p=null,p=0,p='\0'都是正确的
而字符'0’或者空格符的ASCII都不是0
在头文件 中 定义的一个常量 NULL=0;
用于指将指针 悬空(不指向任何位置)楼上的指向0内存不对的.
int p=NULL;
NULL是个好东西,给一出生的指针一个安分的家
NULL总是被定义为0吗
NULL不是被定义为o,就是被定义为(void )0,这两种值几乎是相同的。当程序中需要一个指针时(尽管编译程序并不是总能指示什么时候需要一个指针),一个纯粹的零或者一个void指针都能自动被转换成所需的任何类型的指针。
NULL总是等于0吗
对这个问题的回答与“等于”所指的意思有关。如果你是指“与。比较的结果为相等”,例如:
if(/ ... /)
{
p=NULL;
}
else
{
p=/ something else /;
}
/ ... /
if(p==0)
那么NULL确实总是等于0,这也就是空指针定义的本质所在。
如果你是指“其存储方式和整型值。相同”,那么答案是“不”。NULL并不必须被存为一个整型值0,尽管这是NULL最常见的存储方式。在有些计算机中,NULL会被存成另外一些形式。
如果你想知道NULL是否被存为一个整型值0,你可以(并且只能)通过调试程序来查看空指针的值,或者通过程序直接将空指针的值打印出来(如果你将一个空指针强制转换成整类型,那么你所看到的很可能就是一个非零值)。
欢迎分享,转载请注明来源:表白网
评论列表(0条)