C++中局部变量的返回
在写 “根据中序和后序遍历顺序,构建树的问题” 时,原本这只是一个非常简单的问题,但是突然发现一直有错误。代码如下:
1 node* get_root(int x1, int x2, int y1, int y2) { 2 if (x2 == x1) { 3 return NULL; 4 } 5 else if (x2 - x1 == 1) { 6 node n; 7 n.data= post_order[x1]; 8 return &n; 9 } 10 else { 11 int tmp_root = x2 - 1; // 根结点在后序遍历的下标; 12 node n; 13 n.data = post_order[tmp_root]; // 根结点的值; 14 int tmp_index=y1; 15 for (; in_order[tmp_index] != post_order[tmp_root]; tmp_index++) {} 16 n.left = get_root(x1,x1+tmp_index-y1,y1,tmp_index); 17 n.right = get_root(x1 + tmp_index - y1,x2-1,tmp_index+1,y2); 18 return &n; 19 } 20 }
一直发现缺少某些元素,最后发现,改为下列代码时,正确运行:
1 node* get_root(int x1, int x2, int y1, int y2) { 2 if (x2 == x1) { 3 return NULL; 4 } 5 else if (x2 - x1 == 1) { 6 node* n=new node(); 7 n->data= post_order[x1]; 8 return n; 9 } 10 else { 11 int tmp_root = x2 - 1; // 根结点在后序遍历的下标; 12 node* n=new node(); 13 n->data = post_order[tmp_root]; // 根结点的值; 14 int tmp_index=y1; 15 for (; in_order[tmp_index] != post_order[tmp_root]; tmp_index++) {} 16 n->left = get_root(x1,x1+tmp_index-y1,y1,tmp_index); 17 n->right = get_root(x1 + tmp_index - y1,x2-1,tmp_index+1,y2); 18 return n; 19 } 20 }
错误原因在于局部变量的作用域,在错误的情况,我定义的是普通的局部变量,开辟的内存空间位于stack memory,当函数结束的时候,内存空间进行释放,即使值没有变化,也不能访问对应的内存。当函数结束的时候,即使返回该块内存的地址,也无法对元素进行访问。
修改之后,因为使用new操作符,所以该变量的内存空间位于heap memory,需要人工自行进行管理,或者等到程序结束自动释放。因此函数结束并不影响变量的使用。