void Delete(book *head,int num)
{
book *l;
if(head->num==num)
{
l=head->next;
head=l->next;
::head=head;
delete l;
cout<<"successful"<<endl;
return;
}
while(head)
{
if(head->next==NULL)
{cout<<"not find"<<endl;return;}
if(head->next->num==num)
{
l=head->next;
head->next=l.next;
delete l;
cout<<"successful"<<endl;
return;
}
head=head->next;
}
cout<<"can't found"<<endl;
}
这是部分代码,完整的太长手机码不出来..还请见谅。是这样的这段代码是我看链表时遇到的问题,其中head是全局变量,我的问题是delete接收的是head的内存地址那么做的改变不都会保存下来吗?比如最后一句head每次都会被赋值后一个链表的地址,那全局的head不也变了吗?这样的话即使这个函数体删除了某个链表循环了几次head前的几个链表不都找不到了吗?还请耐心解答下手机码字不容易T_T
问
抱歉手机打字没表达清楚 其实就是想说head在这个循环里指向的位置改变了,那全局变量的head指针指向的位置会变化吗?还有head改变之后为什么要有::head=head;这样改变全局的head指向呢,Delete这个函数体接受的是head的内存地址,在delete里面改变head不就已经改变了全局的head变量了吗? 还请在解答下麻烦了。
谢谢,稍微有点思路了,还想请问个小问题 ,那这个局部head在调用完毕之后不需要delete吗?谢谢!
谢谢,稍微有点思路了,还想请问个小问题 ,那这个局部head在调用完毕之后不需要delete吗?以及第一次判断修改了全局变量::head=head;的值,那第二次判断为什么没有修改呢...?谢谢!
追答第一次修改::head的值是因为确实需要修改,因为if(head->num==num)
这个判断告诉我们想要删除的就是head所指向的这个节点。所以将::head修改为下一个节点,也就是::head = head=l->next;
另外在这里局部head是不需要删除的,我们要先搞清楚delete的作用是什么,它并不是说要释放某个指针本身,而是要释放这个指针所指向的堆空间(通过new来申请),然后就是区分堆栈的区别,堆空间是通过调用new函数来申请的,相应的也必须通过delete的方式来释放,栈空间则是自动分配,自动释放。在这个函数中并没有通过new的方式分配一块新的堆空间,并把这块空间的地址赋给head(如果是这种情况的话,而且之后并不要这块新内存空间,就必须delete head,否则就会内存泄漏)。在这里,它本身只是一个指针,只占用栈空间,随着这个函数的返回,它占用的栈空间会自动释放。
非常感谢!
抱歉手机打字没表达清楚 其实就是想说head在这个循环里指向的位置改变了,那全局变量的head指针指向的位置会变化吗?还有head改变之后为什么要有::head=head;这样改变全局的head指向呢,Delete这个函数体接受的是head的内存地址,在delete里面改变head不就已经改变了全局的head变量了吗? 还请在解答下麻烦了。
追答if(head->num==num) // head->next->num ??? 你下面的l = head->next全局变量为什么建议少用
1.由于全局变量,程序运行期间,始终占有那块存储区,所以空间利用率比较低,大量的全局变量,很快就会把内存用光,所以要少用全局变量;2.全局变量由于每个函数都可以使用,所以任何一个函数的修改,如果修改了全局变量,都有可能影响到其他函数,所以不利于调试。
深入分析C++全局变量初始化
避免跨编译单元之间全局对象的相互引用,使用Construct on First Use Idiom进行延迟初始化,可有效防止初始化顺序带来的问题。std::cout等全局对象的初始化也是有特定机制确保其在正确时间初始化,确保程序的健壮性。总之,理解全局变量初始化机制对于C++开发至关重要。通过合理设计和使用全局对象的初始化机制,...
C++全局变量初始化
全局变量初始化的顺序取决于它们在编译单元内的声明顺序,销毁顺序则相反。对于不同编译单元间的全局变量,C++标准并未明确规定它们之间的初始化(销毁)顺序,实现上由编译器自行决定。不同编译单元间的全局变量的初始化顺序通常是不确定的,即使对同一编译器和同一代码,两次编译的结果也可能不同。在全局...
关于C++全局变量和局部变量的问题!!
全局变量:一个源程序文件可以包含一个或若干个函数。在所有函数体外部定义的变量为全局变量(或外部变量),全局变量可以被本文件中其他所有的函数调用(使用)。有效作用范围:从定义该变量的位置开始到本程序文件的结束。在同一个文件中,若全局变量和局部变量同名,则在局部变量的作用范围内,全局变量不...
C++ 为什么不鼓励使用全局变量
因为全局变量容易导致代码的可复用性下降,以及对象管理的困难。试想,如果某个类使用了全局变量,则移植该类的时候,必须将全局变量也一起移植。更可怕的是,如果这个全局变量还是一个对象,并且初始化也在不同的类中实现,那么所有这些代码将被永久捆绑在一起,无法分离了。任何一个与此全局变量相关联...
C\/C++里面的全局变量是不是每运行一下,那个值要变?
首先全局变量的值不加以认为改动,不会改变。其次全局变量的值在子函数中改动也会影响到主函数。最后在以个函数中,重新定义了一个与全局变量的变量名相同的变量时,会在这个函数里蔽屏掉全局变量,一出这个函数就恢复正常。int a=1;int n(int p){p=12;}main(){printf("%d\\n",a);a=n(a);...
一个关于C++全局变量的问题: 为什么在不同的源文件中访问一个头文件中...
我刚才遇到了你差不多的问题,我的理解是:因为包含.h文件实际上就是把.h中的内容扩展到每个.c中;也就是说,扩展之后每个.c中都定义了这个变量;但又因为static对全局变量是有作用域限制的,所以他们之间的关系是名字一样,(若没有static则会报错,重定义了)但分配的内存地址是不一样的;通俗的...
c++全局变量和局部变量一问题
一般全局变量的范围是文件范围内可用,加了static就本文件可以用,不加static的话,其他文件也可以用改变量。全局变量是声明在所有函数和类,结构之外的变量 局部变量的作用域是在该变量的{}中,但是像 for(int i=0;i<10;++i)printf("%d",i);\/\/这里虽然只有一句,也没有用{}包起来,但i的作用...
如何在C++中设置全局变量?
1、首先,定义一个实现加法运算自定义函数。2、接着,定义一个实现乘法运算的自定义函数。3、最后,在主函数中实现程序的运算。4、定义在函数外部没有被花括号括起来的变量称为全局变量,全局变量的作用域从变量定义的位置开始一直到文件结束。5、如果在一个程序中多个函数都要对同一个变量进行处理,...
C++中全局变量的值需要改变怎么办
全局量 v 用指针: int *v;在程序中动态分配为数组。分配前,你可以改变 lane 的值 (赋值,输入都可)。例: lane=80;v = new int[lane];for (i = 0; i < lane; i++) v[i] = -1;使用完毕,若想改变 v 数组大小,你可以 delete[] v; 然后 改变 lane 的大小,重新动...