Как правильно удалить выделенный массив (структура данных очереди) - PullRequest
0 голосов
/ 30 октября 2019

Я создал структуру данных очереди, используя структуру и динамически размещенный массив, я не понимаю, как правильно освободить или удалить ее без утечек памяти.

Я пытался использовать следующее:

удалить [] q-> данные;

удалить [] & (q-> данные);

удалить & (q-> данные);

#include "queue.h"

void initQueue(queue* q, unsigned int size)
{
    q->maxSize = size;
    q->size = 0;
    q->data = new unsigned int[size];
    q->front = 0;
    q->rear = 0;
}

void enqueue(queue* q, unsigned int newValue)
{
    if (q->size != q->maxSize)
    {
        q->data[q->rear] = newValue;
        q->size++;
        q->rear++;
    }
    else
    {
        std::cout << "Queue is full! you can clean it and initialize a new one" << std::endl;
    }
}

int dequeue(queue* q)
{
    int i = 0;

    if (q->size == 0)
    {
        std::cout << "Queue is empty!" << std::endl;
        return EMPTY;
    }
    else
    {
        q->front++;
        q->size--;

        return q->data[q->front];
    }
}

void cleanQueue(queue* q)
{
    //the delete function
}

1 Ответ

0 голосов
/ 30 октября 2019

Технический правильный ответ здесь - удалить q-> data, как предлагали другие. Но ...

правильный способ освободить или удалить его без утечек памяти

Правильный путь в C ++, если вы не занимаетесь экзотикой с распределением, этоне делать свое собственное управление памятью. Написать класс, который размещается в конструкторе и удаляется в деструкторе, как предположил Крис, является отличным способом узнать о RAII и о том, как он избавляет вас от ментального бремени, когда вы пишете «удалить» везде.

Но правильно ли, если кто-то платил мне? Я бы пропустил все это и использовал бы вектор.

#include <vector>

class MyQueue {
public:
    MyQueue(unsigned int size) : data(size) { }
    void enqueue(unsigned int value) { /* whatever... */ }
    int dequeue() { /* whatever... */ }
private:
    std::vector<unsigned int> data;
};

Когда этот класс выходит из области видимости или удаляется, вектор будет автоматически очищен. Вам даже не нужно ничего освобождать или удалять.

...