我应该在 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>
管理您的内存,这样您就不必再这么做了。
我目前正在为编程考试而学习,并且应该在其中一个练习中为 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>
管理您的内存,这样您就不必再这么做了。