मैं वर्तमान में एक प्रोग्रामिंग परीक्षा के लिए अध्ययन कर रहा हूं और मुझे अभ्यास में से एक में कक्षा "बीट्री" के लिए विनाशक लिखना है। निम्नलिखित कोड एक बाइनरी ट्री है। मुझे नहीं पता कि विनाशक के शरीर में क्या होना चाहिए क्योंकि मैंने अभी तक इसे ठीक से नहीं सीखा है। मुझे लगता है कि वहां कुछ हटाना चाहिए क्योंकि मैंने ढेर पर गतिशील वस्तुओं को भी बनाया है। अग्रिम में धन्यवाद।

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();
}
-2
Vendor 2 सितंबर 2021, 04:36

3 जवाब

सबसे बढ़िया उत्तर

जैसा कि ऊपर बताई गई पोस्ट में है, आपको अपनी वस्तुओं को स्मृति में मुक्त करना चाहिए। मुझे बहुत यकीन नहीं है, लेकिन मुझे लगता है कि यदि आप उन वस्तुओं को मुक्त/हटा नहीं देते हैं तो यह आपके प्रोग्राम में केवल यादृच्छिक अप्रयुक्त स्मृति होगी जिसे आप किसी और चीज़ के लिए उपयोग कर सकते हैं।

समाधान

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;

    };

इसके अलावा सिर्फ एक सुझाव :) आप अपने वर्तमान ऑब्जेक्ट के लिए deconstructor को स्वचालित रूप से कॉल करने के लिए स्मार्ट पॉइंटर्स का उपयोग कर सकते हैं। उदाहरण:

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

Instance->YourFunction(Args...);

अगर मैं कोई गलती या त्रुटि करता हूं, तो मैं रचनात्मक आलोचना के लिए तैयार हूं :)

1
Dharman 2 सितंबर 2021, 05:37

कुछ नहीं, आपको अपने विनाशक में कुछ भी नहीं लिखना चाहिए और अपने सदस्य वस्तुओं को आवंटित करने के लिए new कमांड का उपयोग नहीं करना चाहिए।

अपनी स्मृति को प्रबंधित करने के लिए std::unique_ptr<XXXX> का उपयोग करें ताकि आपको ऐसा न करना पड़े।

1
Bart 2 सितंबर 2021, 05:38

जितना कम आवश्यक हो।

~BTree को delete nikita और दोस्तों के साथ-साथ किसी भी अन्य vertex की जरूरत होगी जो स्वयं। ध्यान दें कि यदि आपको एक विनाशक की आवश्यकता होती है तो आपको अक्सर (और निश्चित रूप से इस मामले में) एक प्रतिलिपि निर्माता और एक असाइनमेंट ऑपरेटर की आवश्यकता होती है। विवरण के लिए इस पेज को द रूल ऑफ थ्री (और दोस्तों) पर देखें।

दूसरी ओर, vertex, संभवत: कोई संसाधन नहीं है और पहले लिंक में चर्चा किए गए ज़ीरो के नियम से पता चलता है कि इसे विनाशक की आवश्यकता नहीं है।

मदद करने के लिए अतिरिक्त उपयोगी पठन; आप इसे एक साथ जोड़ते हैं और कंस्ट्रक्टर्स और डिस्ट्रक्टर्स की बात को बेहतर ढंग से समझते हैं: संसाधन अधिग्रहण का क्या अर्थ है आरंभीकरण (RAII)?

0
user4581301 2 सितंबर 2021, 02:12