Инициализация умного указателя на экземпляр класса и доступ к его методам - PullRequest
0 голосов
/ 17 октября 2018

Итак, я пытаюсь реализовать приоритетную очередь, используя отсортированный список.Мой класс очереди приоритетов унаследован от моего отсортированного списка.Мой класс отсортированного списка работает нормально, когда я тестирую его функции в драйвере, но я получаю "Segmentation Fault 11", когда пытаюсь проверить мою реализацию очереди с приоритетами.Я прогнал свой код через отладчик CLion и получил ошибку "EXC_BAD_ACCESS (code=1, address=0x0)", которая, после некоторых исследований, кажется, вызвана попыткой изменить данные в нулевом указателе.Я впервые использую умные указатели, поэтому я думаю, что мои проблемы связаны с неправильным пониманием того, как они создаются и инициализируются.

Вот мой заголовочный файл для моего SL_PriorityQueue класса:

#ifndef PRIORITY_QUEUE_
#define PRIORITY_QUEUE_

#include "PriorityQueueInterface.h"
#include "LinkedSortedList.h"
#include "PrecondViolatedExcep.h"
#include <memory>

template<class ItemType>
class SL_PriorityQueue : public PriorityQueueInterface<ItemType>
{
  private:
     std::unique_ptr<LinkedSortedList<ItemType> > slistPtr;

  public:
    SL_PriorityQueue();
    SL_PriorityQueue(const SL_PriorityQueue& pq);
    ~SL_PriorityQueue();

    bool isEmpty() const;
    bool enqueue(const ItemType& newEntry);
    bool dequeue();

    //@throw PrecondViolatedExcept if priority queue is isEmpty
    ItemType peekFront() const throw(PrecondViolatedExcep);
};

#endif

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

#include "../src/Node.cpp"
#include "../src/LinkedSortedList.cpp"
#include "../src/SL_PriorityQueue.cpp"
#include <iostream>

int main()
{
    std::shared_ptr<SL_PriorityQueue<int> > testing (new SL_PriorityQueue<int>());
    testing->enqueue(7);
    std::cout << testing->peekFront() << std::endl; //I set a break point here, which is where CLion throws the exception
    std::cout << testing->dequeue() << std::endl;
    std::cout << testing->isEmpty() << std::endl;
    return 0;
}

Вот функцияиз SL_PriorityQueue.cpp, который CLion выделил после исключения:

template <class ItemType>
bool SL_PriorityQueue<ItemType>::enqueue(const ItemType& newEntry)
{
  slistPtr->insertSorted(newEntry);
  return true;
}

Ошибка заставляет меня думать, что когда я вызываю insertSorted в вышеуказанной функции, slistPtr по-прежнему равен нулю.Мой конструктор для SL_PriorityQueue пуст, поскольку кажется, что с помощью интеллектуальных указателей они управляют своей собственной памятью, так что мне не нужно устанавливать ее равной нулевому указателю.

Я пытался сделать slistPtr общимуказатель, чтобы увидеть, не слишком ли много на это указывало, но я только что получил ту же ошибку.

Заранее спасибо за любую помощь, которую вы можете оказать!

1 Ответ

0 голосов
/ 17 октября 2018

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

ЕслиЯ вас правильно понял, вы немного перепутали.Хотя unique_ptr будет правильно очищать память, которой он владеет, он не будет ничего выделять сам.Лучший способ сделать это - использовать std :: make_unique, который вы можете вызвать из вашего конструктора.

template <typename ItemType>
SL_PriorityQueue<ItemType>::SL_PriorityQueue()
   : slistPtr(std::make_unique<LinkedSortedList<ItemType>>())
{
}

Надеюсь, это поможет!

...