C++ C++;:尝试检查指针是否为空时出现异常代码:C0000005
我一直在尝试对我的AVL树类进行单元测试,当我调用“depth()”函数调用递归的“depth(…)”时,我得到以下异常代码: 这是我的深度函数代码:C++ C++;:尝试检查指针是否为空时出现异常代码:C0000005,c++,pointers,exception,C++,Pointers,Exception,我一直在尝试对我的AVL树类进行单元测试,当我调用“depth()”函数调用递归的“depth(…)”时,我得到以下异常代码: 这是我的深度函数代码: int-Tree::depth() { int currentDepth=-1; if(this->isEmpty()==false){ currentDepth=深度(此->根,currentDepth); } 回流深度; } int-Tree::depth(节点*节点,int-currentDepth) { int nodeDepth=当前
int-Tree::depth()
{
int currentDepth=-1;
if(this->isEmpty()==false){
currentDepth=深度(此->根,currentDepth);
}
回流深度;
}
int-Tree::depth(节点*节点,int-currentDepth)
{
int nodeDepth=当前深度;
如果(node->left!=nullptr){//left,currentDepth);
}
如果(节点->右侧!=nullptr){
nodeDepth=深度(节点->右侧,currentDepth);
}
返回nodeDepth+1;
}
我已经查找了导致此错误的原因,大多数人说这是由于未初始化的指针造成的,但我尝试了许多初始化指针的方法,但都没有用。这就是我现在拥有的:
struct节点{
公众:
TreeElement*元素;
节点*父节点;
节点*左;
节点*右;
节点(树元素*元素,节点*父节点){
这个->元素=元素;
这->父=父;
this->left=nullptr;//right=nullptr;
}
~Node(){}
};
调试测试时,它最终会引发此异常:
我正在试图找出如何修复此错误
下面是我的单元测试和代码,用于在需要时向树中添加节点
试验方法:
TEST_METHOD(WHEN_anElementIsAddedToATree_THEN_itHasCorrectDepth)
{
// Arrange
Tree tree;
Word* element = new Word(ANY_WORD);
// Act
tree.add(element);
// Assert
int ANSWER = tree.depth();
const int EXPECTED_ANSWER = 0;
Assert::AreEqual(ANSWER, EXPECTED_ANSWER);
}
添加功能:
void Tree::add(TreeElement* element)
{
if (this->isEmpty()) {
Node node = Node(element, nullptr);
this->root = &node;
}
else if (this->find(element) > -1){
throw "Cet élément est déjà présent";
}
else {
add(element, this->root);
}
}
void Tree::add(TreeElement* element, Node* node)
{
if (element->isBiggerThan(node->element)) {
if (node->right != nullptr) {
add(element, node->right);
}
else {
node->right = &Node(element, node);
}
}
else {
if (node->left != nullptr) {
add(element, node->left);
}
else {
node->left = &Node(element, node);
}
}
}
将this->root
设置为指向节点
。但是节点
是该if
块的本地节点。一旦if
块退出,节点将不再退出。所以this->root
指向一个不再存在的对象
您有责任确保一个对象的寿命比任何指向它的可能被取消引用的指针都长。处理这一问题的最简单方法不是使用“哑指针”,而是使用智能指针,如std::unique_ptr
如果节点是nullpointer
,会发生什么?心理调试器说:复制构造函数和复制赋值运算符不正确,与析构函数冲突。但是我尝试了许多初始化指针的方法,但都没有用——您如何知道初始化是导致错误的原因?如果您的<代码>树
恰好管理不好,并且恰好您向它发送了无效指针,该怎么办?错误的编码,即使是“正确的初始化”,也会导致这些问题。此外,由于您正在使用调试器,请通过单步执行调试器来缓慢地遵循代码路径。指针无效是有原因的,您只需单步遍历代码即可找到代码错误的位置/原因。this->root=&node代码><代码>节点->右侧=&节点(元素,节点)
是一个您经常重复的错误。不能存储超出范围的临时或局部变量的地址。
void Tree::add(TreeElement* element)
{
if (this->isEmpty()) {
Node node = Node(element, nullptr);
this->root = &node;
}