2015-10-21 3 views
1
MainClass *mb[1]; 
Class1 *m1;  
cout << "Constructor type (1 - no parameters || 2 - with parameters): "; 
    int choose; 
    cin >> choose; 
    if (choose == 1) { 
     mb[1] = new Class1; 
    } 
    else if (choose == 2) { 
     mb[1] = new Class1("Red", 1); 
    } 
    m1 = dynamic_cast<Class*>(mb[1]); 
    m1->printEverything(); 
    getchar(); 

и после этого Windows 10 бросает меня «Program1.exe перестает работать». Попытка добавить delete mb [1], но не повезло.Деструктор вызывает ошибку «Stopped working»

Destructor:

~Class() { 
    cout << endl; 
    getchar(); 
} 

Как я могу удалить полученный объект класса?

+1

Индексирование в массивах основано на 0 на C++. Используйте mb [0] для доступа к первому элементу в mb []. Ваша программа читает вне массива mb [], что является недопустимым. – WhiteViking

+1

Кроме того, использование массива только с одним элементом чрезвычайно необычно. –

+1

Ваш деструктор должен быть виртуальным. –

ответ

1

Deallocation должно быть сделано:

delete mb[0] 

Вы должны использовать мб [0], чтобы получить доступ к первому элементу массива

+0

Неверный. 'delete []' предназначен для освобождения памяти, выделенной с помощью 'new []'. В программе OP нигде нет 'new []'. – WhiteViking

+0

Исправить сейчас. Но в итоге вы просто скопировали мой ответ. – WhiteViking

+0

хорошо, вы можете это сказать, но я узнал что-то новое. спасибо в любом случае :) –

1

Вы должны сохранить объект в mb[0] (не mb[1]), так как индексация массива 0 на основе C и C++, и вы зарезервировали только один элемент в mb. Чтение или запись в mb [1] дает неопределенное поведение в вашей программе, что обычно приводит к сбою.

Распределить ваш объект должен быть delete mb[0]. Не с delete[], который предназначен для освобождения памяти, выделенной new [].

+0

Спасибо. Все работает сейчас! – Brock

+0

Рад, что это помогло :-) – WhiteViking

 Смежные вопросы

  • Нет связанных вопросов^_^