[英]c++ delete entire binary search tree
由於某些原因,我的節點似乎並未刪除。 它看起來好像遍歷了ok一樣,但是在“刪除”節點之后,它中仍然有數據。 我也嘗試過free(bNode)
和bNode = NULL
而不是delete bNode
但是它們都給出相同的結果。
當我嘗試調試時, cout
和display函數才被放入。 我只是不明白為什么它不起作用,我希望我不會缺少簡單的東西。
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。” NULL“宏不是類型安全的;如果您必須使用” null“,則將其設為const int而不是C樣式的” #define“。另請參見” C ++編程語言“支持Stroustrup反對使用“ NULL”的說法。”
我會嘗試更改:
if (bNode==NULL) { ... }
同
if (!bNode) { ... }
和
if (bNode->left !=NULL) { ... }
if (bNode->right !=NULL) { ... }
同
if (bNode->left) { ... }
if (bNode->right) { ... }
然后看一下有關如何正確刪除Struct的答案 !
最簡單的解決方案:
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.
}
您的解決方案是正確的,但是您的觀察結果是錯誤的。 刪除對象時,將為該對象執行析構函數。 在您的情況下,此析構函數沒有可見的副作用,因為您的所有數據成員都是純舊的數據類型,它們本身沒有析構函數。 在刪除對象后使用對象,會調用未定義的行為,您的觀察可能是“未定義的行為”的一種體現。
在調用deleteAllBooks()之前,對!= 0的測試是多余的:
void deleteAllBooks ( Book *node )
{
if( node )
{
deleteAllBooks( node->left );
deleteAllBooks( node->right );
delete node;
}
}
一樣,但可能更容易理解。
並且不要將free / alloc與new / delete混合使用。 如果為對象分配了new,則必須使用delete將其返回。 否則,您將獲得未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.