У меня есть класс с именем «Меню», у этого класса есть массив указателей на объекты класса «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!. За исключением этого деструктора. Все работает отлично. Если я не вызываю этот деструктор, ошибки не возникает. Я хочу знать, как решить эту проблему? Я хочу удалить этот массив, чтобы очистить память.

1
Ali Mohyudin 27 Авг 2014 в 14:27

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;
3
quantdev 27 Авг 2014 в 10:43

Я не вижу ничего плохого в опубликованном вами коде.

Хотя утверждение происходит, когда объекты уничтожаются, очевидная ошибка возникает в другом месте; в какой-то момент в течение жизни объекта что-то нацарапано.

Утверждение отладки такого рода не означает, что «ошибка произошла сейчас!». По сути, это означает, что «ошибка произошла некоторое время назад, и я ее только что заметил!».

Найдите ошибку в другом месте вашего кода. Существует ряд инструментов отладки, которые могут инструментировать код и пытаться идентифицировать неопределенное поведение, например использование неинициализированной или нераспределенной памяти.

1
Sam Varshavchik 27 Авг 2014 в 11:07