Какая разница между этими двумя кодами? Есть ли утечка памяти в первом случае?
деструктор не определен
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;
}
};
delete books;
должно быть
delete[] books;
Во втором: books
выделяется как массив, поэтому должен быть удален как массив. Первая версия не имеет утечки памяти.
Разница в том, что в первом случае память для books
это содержится в распределении для каждого экземпляра Library
Тогда во втором случае он выделяется отдельно, используя кучу.
~Library()
{
delete[] books;
}
это правильное решение. Есть свободные возможные проблемы в вашем коде, которые вы можете рассмотреть:
1) использовать список инициализации
во втором случае:
2) Вам действительно нужно сделать указатель? Достаточно ли локального объекта? (я думаю, ваши книги не превышают размер стека). Посмотрите на код, который вы создаете, в начале и удалите в конце. Помните, что стек быстрее и безопаснее.
Также ознакомьтесь с valgrind, это действительно отличный инструмент. Проверьте, поможет ли cppcheck. «sudo apt-get install cppcheck» в Ubuntu.
Во-первых, второй код должен быть
~Library() {
delete[] books;
}
new
должны соответствовать delete
, new[]
должны соответствовать delete[]
,
В первом коде каждый экземпляр Library
содержит 50 экземпляров Book
, Копирование Library
скопирует эти 50 экземпляров. Нет утечки памяти.
Во втором коде экземпляр Library
содержит только указатель на книги. При копировании экземпляра (без конструктора копирования по умолчанию) копируется только указатель — оригинал и копия будут разделять 50 книг, а тот, кто будет уничтожен вторым, выдаст delete
на уже удаленной памяти, что является ошибкой.