У меня есть класс с именем «Меню», у этого класса есть массив указателей на объекты класса «MenuItem». Первые три соответствующие строки класса Menu выглядят так:
class Menu
{
MenuItem *items[5];
В конструкторе класса меню я создаю items
как:
for(int i=0; i<nItems; i++)
{
items[i] = new MenuItem(titles[i],...); //with all necessary parameters
В деструкторе класса Menu я удаляю items
как:
~Menu()
{
for(int i=0; i<nItems; i++)
delete items[i];
Проблема: Моя проблема в том, что когда я вызываю этот деструктор, я получаю ошибку Debug Assertion Failed!
. За исключением этого деструктора. Все работает отлично. Если я не вызываю этот деструктор, ошибки не возникает. Я хочу знать, как решить эту проблему? Я хочу удалить этот массив, чтобы очистить память.
2 ответа
Трудно сказать, в чем проблема, без дополнительного контекста (хотя я бы сделал ставку на проблему с конструктором копирования и / или оператором присваивания, или с неправильным значением для nItems
).
Лучший способ управлять этими необработанными указателями - вообще не иметь их.
Рассмотреть возможность :
Массив умных указателей:
std::unique_ptr<MenuItem> items[5];
Или std::array
умных указателей:
std::array<std::unique_ptr<MenuItem>, 5> items;
Или vector<>
умных указателей:
std::vector<std::unique_ptr<MenuItem>> items;
items.push_back(std::unique_ptr<MenuItem>(new MenuItem(...)));
Надеюсь, это поможет.
Я не вижу ничего плохого в опубликованном вами коде.
Хотя утверждение происходит, когда объекты уничтожаются, очевидная ошибка возникает в другом месте; в какой-то момент в течение жизни объекта что-то нацарапано.
Утверждение отладки такого рода не означает, что «ошибка произошла сейчас!». По сути, это означает, что «ошибка произошла некоторое время назад, и я ее только что заметил!».
Найдите ошибку в другом месте вашего кода. Существует ряд инструментов отладки, которые могут инструментировать код и пытаться идентифицировать неопределенное поведение, например использование неинициализированной или нераспределенной памяти.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
nItems=4
std::vector
и/илиstd::unique_ptr
, которые специально разработаны для правильного управления памятью, а не жонглировать указателями и надеяться на лучшее?