由于某种原因,我的节点似乎没有删除。它看起来好像遍历到最后确定但在节点被“删除”之后它仍然有数据。我也试过了
free(bNode)
和bNode = NULL
代替delete bNode
,但它们都会给出相同的结果。
当我尝试调试时,cout
和显示功能刚刚放入。我只是不明白为什么它不起作用,我希望我不会错过一些简单的东西。
struct
Book{
char title [50];
char url [75];
Book *left;
Book *right;
};
void deleteAllBooks (Book *bNode){
if(bNode==NULL) return;
if(bNode->left !=NULL){
cout << endl << "deleting left" << endl;
deleteAllBooks(bNode->left);
}
if(bNode->right !=NULL){
cout << endl << "deleting right" << endl;
deleteAllBooks(bNode->right);
}
cout << endl << "deleting node " << bNode->title << endl;
delete bNode;
displayBookTree(bNode);
}
void displayBookTree(Book *bNode){
if(bNode==NULL){
cout << "No books" << endl;
return;
}
if(bNode->left !=NULL){
displayBookTree(bNode->left);
}
if(bNode->right !=NULL){
displayBookTree(bNode->right);
}
cout <<"Title: " << bNode->title << endl;
cout <<"URL: " << bNode->url <<endl;
}
答案 0 :(得分:2)
“使用0.”NULL“宏不是类型安全的;如果您认为必须这样做 使用“null”,使其成为一个const int而不是C风格的“#define”。也 请参阅Stroustrup反对的“C ++编程语言” 使用“NULL”。“
我会尝试改变:
if (bNode==NULL) { ... }
与
if (!bNode) { ... }
并且
if (bNode->left !=NULL) { ... }
if (bNode->right !=NULL) { ... }
带
if (bNode->left) { ... }
if (bNode->right) { ... }
然后看看this answer如何正确删除Struct!
答案 1 :(得分:0)
最简单的解决方案:
struct Book{
std::string title;
std::string url;
std::unique_ptr<Book> left;
std::unique_ptr<Book> right;
};
void deleteAllBooks (std::unique_ptr<Book> bNode)
{
// No code necessary. Literally. But usually you wouldn't even
// bother with this function, the default Book::~Book is fine.
}
答案 2 :(得分:0)
您的解决方案是正确的,但您的观察结果是错误的。删除对象时,将对该对象执行析构函数。在您的情况下,此析构函数没有可见的副作用,因为您的所有数据成员都是普通的旧数据类型,它们没有自己的析构函数。在删除对象后使用它,调用未定义的行为,您的观察是“未定义行为”的可能化身。
在调用deleteAllBooks()之前测试!= 0是多余的:
void deleteAllBooks ( Book *node )
{
if( node )
{
deleteAllBooks( node->left );
deleteAllBooks( node->right );
delete node;
}
}
做同样的事情,但可能更容易理解。
不要将free / alloc与new / delete混合使用。如果您已使用new分配了一个对象,则必须使用delete返回它。否则,您将得到未定义的行为。