GTest - модульное тестирование деструктора класса односвязных списков - PullRequest
0 голосов
/ 07 февраля 2020

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

Любые мысли о том, как я могу использовать GTest для сделать это?

Вот что у меня есть:

Реализация класса связанного списка:

struct ListNode 
{
  int val;
  ListNode *next;
  ListNode(int x) : val(x), next(nullptr) {}
};

class SinglyLinkedList 
{
private:
    int list_size; // internal size variable to amortize size()
    ListNode* tail_; // Pointer to the last element to amortize push_back() and back()
    void new_head_tail(int i); // internal function to initialize a list with its first element
public:
    ListNode* head_; // Pointer to the first element

    // default constructor
    SinglyLinkedList()
    {
        // initialize ListNode
        head_ = nullptr;
        tail_ = nullptr;    
        list_size = 0;
    }


    // destructor
    ~SinglyLinkedList() 
    {
        while(!this->empty())
        {
            this->pop_front();
        } 
    }   

    bool empty(); // checks if empty
    void push_front(int i); // inserts at the front
    void pop_front(); // removes the first item

    // ... other functions

};

Соответствующие функции:

void SinglyLinkedList::push_front(int i)
{
    if(this->head_ != nullptr)
    {
        ListNode* n = new ListNode(i);
        n->next = this->head_;
        this->head_ = n;
    }
    else
    {
        this->new_head_tail(i);
    }
    this->list_size++;
}

void SinglyLinkedList::pop_front()
{
    if(this->head_ != nullptr)
    {
        ListNode* n = this->head_;
        this->head_ = this->head_->next;
        n->next = nullptr;
        delete n;
        this->list_size--;
    }
    else
    {
        printf("List Empty. Nothing to pop.\n");
    }
}

bool SinglyLinkedList::empty()
{
    return (this->list_size == 0);
}

Тест :

TEST(SINGLY_LINKED_LIST_TEST, DESTRUCTOR)
{
    SinglyLinkedList* sll = new SinglyLinkedList();
    delete sll;

    SinglyLinkedList* expected = nullptr;

    EXPECT_EQ(expected, sll);
}

Очевидно, что вышеописанное не работает, так как местоположение sll является случайным шестнадцатеричным значением. Поэтому мне интересно, как мне лучше всего использовать библиотеку GTest, чтобы убедиться, что вся память была правильно освобождена.

Примечание: я только динамически распределял этот экземпляр класса, поэтому я мог убедиться, что деструктор вызывается до того, как я выполню EXPECT_EQ ().


...