2017-02-22 50 views
0

Я пытаюсь реализовать очередь с использованием последовательного списка. Однако для очередей со строковыми элементами программа вылетает из строя.Переопределение деструктора по умолчанию для строк в реализации класса

Ниже приводится соответствующая часть конструктора очереди:

{ 
    string *ptr = new string[num]; 
} 

Посмотрев на некоторое время, я подозреваю, что проблема с деструктора. Призывая деструктор, я удалить указатель на массив последовательного списка и установить его в NULL:

{ 
    delete ptr; 
    ptr = NULL; 
} 

Однако, поскольку библиотека строки содержит деструктор по умолчанию, который удаляет строку, и я затем пытаюсь удалить несуществующий указатель. Я думаю, что это будет доступ к недоступной памяти, которая вызывает ошибку сегментации. Реализация Queue отлично работает для int и double, как она сейчас стоит.

Я использую шаблоны для типов int, double и string. Если деструктор пуст, это не приведет к динамическому освобождению памяти для целых и двойных элементов.

Есть ли какой-либо простой способ обойти это, кроме как иметь пустой деструктор класса и использовать деструктор строки по умолчанию?

+0

Почему вы не используете 'std :: string'? Нет необходимости в переопределении деструкторов. Если ваш шаблон работает с 'int',' double', тогда он должен работать с 'std :: string', без особой необходимости« удалять »что-либо. – PaulMcKenzie

+5

Опубликуйте минимальный, но полный пример, который читатели могут попробовать, просто копируя и вставляя код и компилируя его. –

+0

Alf - этот вопрос относится к бонусу при назначении класса, поэтому я стараюсь быть более общим. Однако, спасибо за совет. –

ответ

0

delete удаляет только первый экземпляр для неспростых типов. delete [] вызывает dtors для всех экземпляров

Здесь я не знаю полный объем, но только для заметки удаление nullptr четко определено и ничего не делает.