我应该在 class 的析构函数中写什么

What should i write inside a destructor of a class

我目前正在为编程考试而学习,并且应该在其中一个练习中为 class“BTree”编写一个析构函数。下面的代码是一个二叉树。我不知道析构函数的主体中应该包含什么,因为我还没有正确地了解它。我认为 delete 里面应该有一些东西,因为我还在堆上用 new 创建了动态对象。提前致谢。

class BTree
{


public:
    vertex* root;

    BTree()
    {
        root = NULL;
    };

    ~BTree() {
        
    };

    bool isEmpty() { return root == NULL; }

    vertex* Nikita = new vertex("Nikita");
    vertex* Vendor = new vertex("Vendor");
    vertex* faehrt = new vertex("faehrt");
    vertex* nach = new vertex("nach");
    vertex* Alexendria = new vertex("Alexandria");


    void main() {
        root = node(node(create(), Nikita,node(create(), Vendor, create() ))
                    , faehrt,
                    node(create(), nach, node(create(), Alexandria, create() ))
                    );
        cout << empty (right(root)) << endl;
        cout << value(left(root)) << endl << endl;

    };
class vertex{

public:

    int key;
    string data;
    vertex* leftChild;
    vertex* rightChild;
    vertex* parent;
    int height;


    vertex(string data){

        key = ID;
        this->data = data;
        leftChild = NULL;
        rightChild = NULL;
        parent = NULL;
        ID++;
    };

    vertex(){
        key = 0;
        leftChild = NULL;
        rightChild = NULL;
        parent = NULL;
    };

    ~vertex(){

    };
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

#include "BTree.h"


int main() {

// Aufgabe 1
    BTree B;

    B.main();

// Aufgabe 2
    BTree C = B;
    C.print();


// Aufgabe 3
    BST D;

    D.main();
    D.print(D.root);
    D.sortvector(); //neu hinzugefügt

// Aufgabe 4
//  D.PrintLayers();
}

尽可能少。

~BTree 需要 delete nikita 和朋友,以及任何其他 vertex 涉及 own. Note that if you require a destructor you often (and definitely will in this case) need a copy constructor and an assignment operator. See this page on The Rule Of Three (and friends) 的详细信息。

另一方面,

vertex 可能不拥有任何资源,并且在之前 link 中讨论的零法则表明它根本不需要析构函数。

额外的有用阅读帮助;你把它们联系在一起,更好地理解构造函数和析构函数的要点:What is meant by Resource Acquisition is Initialization (RAII)?

如上文所述post,您应该释放内存中的对象。我不太确定,但我认为如果您不释放/删除这些对象,它只会在您的程序中随机放置未使用的内存,您可以将其用于其他用途。

解决方案

class BTree
{


public:
    vertex* root;

    BTree()
    {
        root = NULL;
    };

    ~BTree() 
    {
        delete this->Nikita;
        delete this->Vendor;
        delete this->faehrt;
        delete this->nach;
        delete this->Alexendria;

    };

    bool isEmpty() { return root == NULL; }

    vertex* Nikita = new vertex("Nikita");
    vertex* Vendor = new vertex("Vendor");
    vertex* faehrt = new vertex("faehrt");
    vertex* nach = new vertex("nach");
    vertex* Alexendria = new vertex("Alexandria");


    void main() {
        root = node(node(create(), Nikita,node(create(), Vendor, create() ))
                    , faehrt,
                    node(create(), nach, node(create(), Alexandria, create() ))
                    );
        cout << empty (right(root)) << endl;
        cout << value(left(root)) << endl << endl;

    };

也只是一个建议 :) 您可以使用智能指针自动调用当前对象的析构函数。示例:

std::unique_ptr<BTree> Instance = std::make_unique<BTree>();

Instance->YourFunction(Args...);

如果我犯了任何错误或错误,我愿意接受建设性的批评:)


没什么,你不应该在你的析构函数中写任何东西,也不应该使用 new 命令来分配你的成员对象。

使用 std::unique_ptr<XXXX> 管理您的内存,这样您就不必再这么做了。