Проблема деструктора

Какая разница между этими двумя кодами? Есть ли утечка памяти в первом случае?

деструктор не определен

 class Library
{
private:
Book books[50];
int index;
public:
Library()
{

index=0;
}
};

или с определенным деструктором

class Library
{
private:
Book *books;
int index;
public:
Library()
{
books=new Book[50];
index=0;
}
~Library()
{
delete books;
}
};

1

Решение

delete books;

должно быть

delete[] books;

Во втором: books выделяется как массив, поэтому должен быть удален как массив. Первая версия не имеет утечки памяти.

Разница в том, что в первом случае память для books это содержится в распределении для каждого экземпляра LibraryТогда во втором случае он выделяется отдельно, используя кучу.

3

Другие решения

~Library()
{
delete[] books;
}

это правильное решение. Есть свободные возможные проблемы в вашем коде, которые вы можете рассмотреть:

1) использовать список инициализации

во втором случае:

2) Вам действительно нужно сделать указатель? Достаточно ли локального объекта? (я думаю, ваши книги не превышают размер стека). Посмотрите на код, который вы создаете, в начале и удалите в конце. Помните, что стек быстрее и безопаснее.

Также ознакомьтесь с valgrind, это действительно отличный инструмент. Проверьте, поможет ли cppcheck. «sudo apt-get install cppcheck» в Ubuntu.

1

Во-первых, второй код должен быть

~Library() {
delete[] books;
}

new должны соответствовать delete, new[] должны соответствовать delete[],

В первом коде каждый экземпляр Library содержит 50 экземпляров Book, Копирование Library скопирует эти 50 экземпляров. Нет утечки памяти.

Во втором коде экземпляр Library содержит только указатель на книги. При копировании экземпляра (без конструктора копирования по умолчанию) копируется только указатель — оригинал и копия будут разделять 50 книг, а тот, кто будет уничтожен вторым, выдаст delete на уже удаленной памяти, что является ошибкой.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector