C++ C+中的指针范围+;

C++ C+中的指针范围+;,c++,scope,C++,Scope,虽然这是一个非常普遍的问题,但下面是我的具体示例,这样您就可以理解我的问题 我有一个四叉树类的复制构造函数。因此,我编写了一个名为copy的递归助手方法,以便在复制构造函数中调用它。辅助对象接受一个参数,即节点。从构造函数调用时,根节点作为第一个参数 现在在我的helper方法中,我创建了一个新节点,称之为newNode,每个节点都有成员变量neChild、nwChild、seChild、swChild----sw表示西南西北、东北、东南都是基本方向,我将每个新的子节点设置为source.chi

虽然这是一个非常普遍的问题,但下面是我的具体示例,这样您就可以理解我的问题

我有一个四叉树类的复制构造函数。因此,我编写了一个名为copy的递归助手方法,以便在复制构造函数中调用它。辅助对象接受一个参数,即节点。从构造函数调用时,根节点作为第一个参数

现在在我的helper方法中,我创建了一个新节点,称之为
newNode
,每个节点都有成员变量neChild、nwChild、seChild、swChild----sw表示西南西北、东北、东南都是基本方向,我将每个新的子节点设置为source.child。然后,我对每个source.child(其中4个)再次递归调用helper方法。这样,1个节点变成4个,然后有16个子节点,依此类推。然后我返回我创建的第一个
newNode

问题: 新返回的节点是否将所有其他节点连接到它?它将是一个树结构(虽然不是正式的树)?或者,附加到返回指针上的指针是否会超出范围?

从堆中分配的内容在函数返回时不会超出范围。指向堆上某个对象的局部变量将超出范围,但是,如果您从函数返回它,那么您将保留一个副本

但是,如果这些变量是自动的(在堆栈上),则返回时它们将超出范围

并且,根据您的代码,这类似于(由于OP表示这是家庭作业,他们不希望保留副本,所以没有发布实际代码):

XTreeNode XTreeNode::copy(XTreeNode&const n){

XTreeNode*newNode=newxtreenode(7);//假设您从
copy
方法返回
QuadtreeNode*
,则从该函数返回的指针将在该函数外部保持有效,直到您使用
delete
手动释放内存为止。如果
newNode
类型为
QuadtreeNode*
,则访问mem的方法为ber变量/方法使用
->
运算符


newNode
位于堆栈上,但它指向的内存位于堆上(在本例中,对象位于此位置)。因此,它返回对堆上位置的引用(如果返回类型为
QuadtreeNode*
)。很好。但是,程序需要使用
删除
来释放从堆/空闲存储中获取的资源,否则内存泄漏将占上风。

首先,正如其他人所指出的,当您创建
新节点时,您混淆了
四叉树节点
四叉树节点*
。我假设它是一个指针

其次,你没有很好地防范空值


第三,如果我对这段代码的理解是正确的,那么对
copy
的四个递归调用只会产生内存泄漏;每个调用在堆上生成一个新节点,并返回一个指向该新节点的指针,但您的代码不保留该指针。因此
copy
将返回一个指向新节点的指针,该节点有子指针指向到参数节点的子节点,仅此而已。

您将得到一个新的根节点,该节点链接到与原始树相同的子节点。因此,对任何子节点所做的任何更改都将影响这两棵树,以后可能会出现双重自由问题

这是因为,尽管您递归调用
copy
,但您正在丢弃返回值


此外,您还说这个
copy
函数是从您的复制构造函数调用的?您会受到伤害,因为
copy
调用复制构造函数(在return语句中,因为您是按值返回的)。这是导致堆栈溢出的原因。我想你的位置是对的;)

如果你发布代码,会更容易理解。我们需要看看你是如何为节点分配内存的。@bitmoe,因为这是一个赋值,你应该把它标记为家庭作业。无论如何,即使你删除了自己的代码,它在编辑历史。但是,我修改了代码以保护罪犯:-),同时仍然保留了本质。@bitmoe,你不能请求我们的帮助,也不能请求我们不要帮助你的同学。我们在这里发布的答案大部分是公开的和永久的——这就是StackOverflow的工作原理。你发布的代码不会编译。如果你正在分配g堆栈上节点的内存(即执行
QuadtreeNode newNode;
),然后查看@paxdiablo的答案。如果您是从堆分配内存(即执行
QuadtreeNode*newNode=newquadtreenode(…);
,然后需要将返回类型更改为
QuadtreeNode*
,并将对象的访问从使用
更改为
->
XTreeNode XTreeNode::copy(XTreeNode & const n) {
    XTreeNode *newNode = new XTreeNode(7);  // <-- Note "*", this is important.
    newNode.xy=n.xy;
    return newNode;
}