gpt4 book ai didi

C++ 访问冲突?

转载 作者:太空狗 更新时间:2023-10-29 20:30:14 25 4
gpt4 key购买 nike

当我在 Linux 中编写代码时,如果相同的代码非常有效,为什么我会在读取位置 0xC0000005 时遇到访问冲突?

if(nodo->izq!=NULL) //nodo is a class or struct and "sig" is a pointer of the same kind
VaciarAux(nodo->izq);

有没有办法在没有未处理异常的情况下完成这项工作?断言会成功吗?

这是函数

void Arbol<T>::VaciarAux(Nodo<T> * &nodo)
{
if(nodo->izq!=NULL)
VaciarAux(nodo->izq);
if(nodo->der!=NULL)
VaciarAux(nodo->der);
if(nodo->izq == NULL && nodo->der ==NULL)
{
actual = nodo;
nodo=NULL;
delete actual;
contador--;
}

最佳答案

很可能是因为 nodo 本身是一个无效指针。 -> 取消引用会导致问题。

您需要检查可能影响该值的因素(缓冲区溢出导致损坏,由于某种原因设置为 NULL)。

注意:

if (nodo->izq != NULL)

检查nodo变量是否为NULL,而是检查nodo指向的izq成员to 为 NULL。

如果你只是想在nodo本身为NULL时什么也不做,你可以在开头:

if (nodo == NULL) return;

但我仍然认为追溯问题的根源比仅仅解决一个症状要好得多。


我认为问题在于您处理树的方式。你正在有效地做:

def delTree (node):
if node.left != NULL:
delTree (node.left)
if node.right != NULL:
delTree (node.right)
if node.left == NULL and node.right == NULL:
delete node and whatever else you have to do

这样做的主要问题是 delTree (node.left) 意味着如果树是空的,你会得到你看到的确切问题,因为你尝试做的第一件事是取消引用 NULL 根节点。

更常用的方法是首先无条件地递归子节点(使用 NULL 保护器)然后处理节点本身,例如:

def delTree (node):
if node == NULL:
return
delTree (node.left)
delTree (node.right)
delete node and whatever else you have to do

这将正确处理一棵空树,并且仍然正确地删除父级之前的所有子级。而且它只是看起来更优雅,这是首先使用递归的原因之一:-)

我将把它留作练习,供读者将其转换回 C++。

关于C++ 访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7592367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com