Я удаляю узлы в своем классе BucketSort, но как мне удалить объект? - PullRequest
0 голосов
/ 16 ноября 2018
BucketSort::~BucketSort() {
    for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
        if (a[i] != nullptr) {
            a[i]->deleteBucket();
        }
    }

    delete a;
    a = nullptr;
}

Это мой код деструктора.Мой профессор говорит мне: «Вызывая функцию deleteBucket, вы удаляете узлы, но не объект».Тем не менее, Я не понимаю, что это значит, или, по крайней мере, я, должно быть, что-то упустил. Как я могу удалить объект, как она говорит?

Это в основном класс сортировки сегментов, который сортирует в соответствии с алгоритмом сортировки сегментов, показанным здесь: https://www.geeksforgeeks.org/wp-content/uploads/scene01801.jpg

Все эти классы складываются, чтобы создать именно это.Все функции работают нормально, за исключением того, что функция-член деструктора нуждается в некоторой подстройке.

Вот файл .cpp для Bucket Sort:

#include "bucketsort.h"

BucketSort::BucketSort() {
    a = new Bucket*[DEFAULT_CAPACITY]();
    numberOfElements = 0;
}

void BucketSort::print() const {
    for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
        if (a[i] != nullptr) {
            a[i]->print();
        }
    }
}

void BucketSort::insert(const vector <double>& v)  {
    int index;

    int vectorSize = v.size(); // New addition to the codebase.
    for (int i = 0; i < vectorSize; ++i) {
        index = v[i] * 10;

        if (a[index] == nullptr) {
            Bucket* newBucket = new Bucket;
            a[index] = newBucket;
        }

        a[index]->insert(v[i]);
        ++numberOfElements;
    }
}

void BucketSort::createSortedList(Bucket& thisBucket) {
    for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
        if (a[i] != nullptr && !a[i]->isEmpty()) {
            thisBucket.moveAppend(*a[i]);
        }
    }
}

BucketSort::~BucketSort() {
    for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
        if (a[i] != nullptr) {
            a[i]->deleteBucket();
        }
    }

    delete a;
    a = nullptr;
}

Вот мои заголовки для справки:

Bucketsort.ч :

#ifndef BUCKETSORT_H
#define BUCKETSORT_H    

#include "bucket.h"
#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

const int DEFAULT_CAPACITY = 10;

class BucketSort
{
public:
    // Constructors:
    BucketSort();
    // Functions:
    void print() const;
    void insert(const vector <double>& v);
    void createSortedList(Bucket& a);
    //
    ~BucketSort();
private:
    Bucket** a;
    int numberOfElements;
};

#endif

Bucket.h:

#ifndef BUCKET_H
#define BUCKET_H    

#include <iostream>
using namespace std;

class Node
{
public:
    Node() : item(0.0), link(nullptr) {}
    Node(double newItem, Node *newLink) : item(newItem), link(newLink) {}
    Node* getLink() const { return link; }
    double getItem() const { return item; }
    void setItem(double newItem) { item = newItem; }
    void setLink(Node *newLink) { link = newLink; }
    ~Node() {}
private:
    double item;
    Node *link;
};


class Bucket
{
public:
    Bucket();
    void insert(double value);
    void moveAppend(Bucket& otherBucket);
    void print() const;
    bool isEmpty() const;
    Bucket& operator=(Bucket&& otherBucket);
    void deleteBucket();
    ~Bucket();
private:
    Node * ptrToFirst;
    Node *ptrToLast;
    int numberOfElements;
};

#endif

SortedList.h:

#ifndef SORTEDLIST_H
#define SORTEDLIST_H    

#include "bucketsort.h"
#include <vector>

using namespace std;

class SortedList : public Bucket
{
public:
    SortedList();
    void sortList(const vector <double>& list);
    ~SortedList();
private:
};

#endif

Тестовый водитель:

#include "Bucket.h"

void runBucketTest() {
    Bucket bucket1;
    Bucket bucket2;
    Bucket bucket3;
    Bucket bucket4;
    Bucket bucket5;
    Bucket bucket6;
    Bucket bucket7;
    Bucket bucket8;
    Bucket bucket9;

    cout << "--------------------------------------------" << endl;
    cout << "Bucket testing" << endl;
    cout << "--------------------------------------------" << endl;
    cout << "Bucket 1: ";
    bucket1.insert(77);
    bucket1.insert(42);
    bucket1.insert(93);
    bucket1.print();
    bucket2.insert(91);
    cout << endl << "Bucket 2: ";
    bucket2.print();
    bucket2.moveAppend(bucket1);
    cout << endl << "Bucket 2 after moveAppend w/bucket 1 having existing elements: ";
    bucket2.print();
    bucket4.insert(69);
    bucket4.insert(21);
    bucket4.insert(979);
    cout << endl << "Bucket 4: ";
    bucket4.print(); 
    cout << endl << "Bucket 3 after moveAppend w/bucket 4 having NO existing elements: ";
    bucket3.moveAppend(bucket4);
    bucket3.print();
    cout << endl << "Bucket insertion into Bucket 5 and then deletion: " << endl;
    bucket5.insert(101);
    bucket5.insert(202);
    bucket5.insert(303);
    cout << "Before deletion: ";
    bucket5.print();
    cout << endl << "After deletion: ";
    bucket5.deleteBucket();
    bucket5.print(); 
    cout << endl << "Bucket 6 = Bucket 7 assignment operator: " << endl;
    bucket7.insert(10);
    bucket7.insert(20);
    bucket7.insert(5);
    cout << "Buckets 6 before assignment operator: ";
    bucket6.print();
    cout << endl << "Bucket 7 before assignment operator: ";
    bucket7.print();
    cout << endl << "Bucket 6 after assignment operator (Bucket 6 = Bucket 7): ";
    bucket6 = move(bucket7);
    bucket6.print();
    bucket8.insert(22);
    bucket8.insert(21);
    cout << endl << "Bucket 8 (already containing some elements) before assignment operator: ";
    bucket8.print();
    cout << endl << "Bucket 8 after assignment operator (Bucket 8 = Bucket 9): ";
    bucket8 = move(bucket9);
    bucket8.print();
}

Результат теста: https://i.imgur.com/zU7T2Su.png

Могу ли я получить некоторую помощь?

1 Ответ

0 голосов
/ 16 ноября 2018

Поскольку вы создали экземпляр массива указателей Bucket

a = new Bucket*[DEFAULT_CAPACITY]();

Вам потребуется удалить память, на которую ссылается каждый указатель:

delete a[i];

Что должно привести к:

BucketSort::~BucketSort() {
    for (int i = 0; i < DEFAULT_CAPACITY; ++i) {
        if (a[i] != nullptr) {
            a[i]->deleteBucket();
            delete a[i];
        }
    }

    delete a;
    a = nullptr;
}
...