发布网友 发布时间:2022-04-26 03:53
共2个回答
热心网友 时间:2022-06-20 15:42
当指针p=null时,指针p是无效指针,所以free(p);操作也是无效的,操作多少次也是无效,就相当于不执行free(p);!而当p不为null时,一般又有两种情况:一种是p是野指针,一次都不能操作,操作就要产生运行时错误;二是p是由malloc之类的函数分配的有效空间的首地址,只能用free(p);释放一次,然后p就变成了所谓“悬浮指针”,就是说它指向的空间已经不存在了,这时若还进行free(p);操作,也将产生运行时错误,就是说已经没有空间可释放了,代码运行时出错了!所以一般主张free(p);操作成功后应立马写一句p=null;以规避这种错误。
热心网友 时间:2022-06-20 15:42
外面的判断是为了防止不必要地操作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已经实例化后避免线程再进入临界区,提升性能。