gpt4 book ai didi

c++ - Visual Studio 2010 调试 "if (var == NULL)"未触发

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:13 24 4
gpt4 key购买 nike

已解决 - 构造函数问题

Matthew FlaschenMichael Burr指出 Node(int) 的重载构造函数调用 Node() 不起作用的问题 because...谢谢大家!


我已经构建了一个程序(我正在调试它)并且遇到了一个奇怪的问题......一个 `if` 语句没有在它应该被触发的时候被触发......这是一个学校项目,我们必须构建一个具有至少一个“优化”功能的 AVL 树。

我确信并测试过 `rdown` 和 `ldown` 起作用(作为平衡因素)——树不是完全平衡的。相反,它基于分支的高度(即 - `balance()` 应该只返回 (1,0,-1) 否则它是不平衡的。

我希望这些信息足以解决这个奇怪的问题......我以前从未在 Microsoft Visual Studio 2010 中遇到过这样的事情。

节点结构:

struct Node {
int data; // the data in the Node
int rdown; // the number of ellements below the node on the right side
int ldown; // the number of ellements below the node on the left side
Node * parrent; // the node's parrent
Node * lchild; // the nodes left child
Node * rchild; // the nodes right child

Node () { rdown = 0, ldown = 0; data = 0; parrent = NULL; lchild = NULL; rchild = NULL; }
Node (int dat) {rdown = 0, ldown = 0; parrent = NULL; lchild = NULL; rchild = NULL; data = dat; }
bool end() { if (lchild == NULL && rchild == NULL) return true; // check if this node is the 'end of the line' - where it doesn't
return false; } // have any children
bool goodToAdd() { if (lchild == NULL || rchild == NULL) return true; // make sture the current node has at least one spot to add
return false; } // a new node to - either lchild or rchild must be NULL

int balance() { return (ldown - rdown); } // get a balance number for the node
};

导致问题的搜索功能

Node * AVL_Tree::search(const Node * num) {
Node * tmpNode = AVL_Tree::root; // tmpNode is a place holder for the search
for (int i = 1; true; i++) { // increment int i to check for excess searching -> pervents endless loop
if (tmpNode == NULL) //****** causing problems******** // the search has reached a dead end (the data is not contained) ==> NULL
return NULL;
if (tmpNode->data == num->data) // if the data of num is the same as tmpNode the data is contained ==> Node *
return tmpNode;
// since the node has not been found yet move down the tree...
if (tmpNode->data > num->data && tmpNode->lchild != NULL) // if the data is smaller than the tmpNode move to the lchild
tmpNode = tmpNode->lchild;
else if (tmpNode->rchild != NULL) // since the node has been proven to not be = to the data to be searched for
tmpNode = tmpNode->rchild; // and it is not smaller... move to the right

if (i > (root->ldown + 1) && i > (root->rdown + 1) ) { // the while loop has searched suffecent time and has not ended
string tmp = "the search incountered a critical error... aborting..."; // to prevent an endless loop the string error
throw tmp; // is thrown (should not happen) - indicates a broken tree
}
}
}

第一次遇到 for 循环

的屏幕截图

alt text

第二次遇到 for 循环

的屏幕截图

如果您在底部的“Autos”选项卡中注意到所有数据和节点本身的地址都是 NULL - 但在下一个屏幕截图中它会继续 alt text

节目继续!!!什么?>!

我按下 F-10(“转到下一个命令”按钮)……它直接跳过语句?为什么? alt text

最佳答案

0xcdcdcdcd 不是 NULL 指针 - 该值在 MSVC 的调试版本中用于已分配但未初始化的内存。

参见 When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?了解更多详情。

问题的根源可能在于采用 int 参数的构造函数:

Node (int dat) { Node(); data = dat; } 

Node(); 语句最终什么也不做。此构造函数使结构的大部分成员未初始化。

关于c++ - Visual Studio 2010 调试 "if (var == NULL)"未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200170/

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