шаблоны — C ++ Удаление указателя

Я пишу программу, которая использует структуры указателей и неконтролируемых элементов, и я пытаюсь правильно освободить мои данные, чтобы уменьшить накладные расходы (это действительно важно).

Это то, что у меня есть. По сути, я создаю свою очередь с конкретными функциями. Моя структура просто содержит часть общих данных и указатель на следующую точку.

template<class T>
struct Spot
{
T data;
Spot *spotBehind;
};

Когда я добавить новый элемент, Я делаю это с помощью следующего кода (я отслеживаю как голову, так и хвост моей очереди).

if(front == NULL)           //Make first head
{
Spot<T> *newSpot = new Spot<T>();
newSpot->data = newElement;
newSpot->spotBehind = front;
front = newSpot;
back = front;
}
else        //Find back of line and add
{
Spot<T> *newSpot = new Spot<T>();
newSpot->data = newElement;
newSpot->spotBehind = NULL;
back->spotBehind = newSpot;
back = newSpot;
}

Так что после этого, когда дело доходит до деструктора, конечно, мне нужно иметь удалять для каждого новый что у меня есть. Так что мой деструктор использует код:

Spot<T> *current = front;
Spot<T> *next = NULL;
while(current != NULL)
{
next = current->spotBehind;

delete current;
current = NULL;

current = next;
}

Теперь моя забота здесь. Когда я использую свой деструктор, я не думаю, что он делает то, что должен, и у меня здесь могут быть утечки памяти. Через различные соиЬ Заявления, я могу проверить, что моя информация хранится и работает, как ожидалось. Но когда я удаляю данные, они на самом деле не удаляются. Чтобы попытаться отладить его, я заменил код реконструктора (см. Выше) на следующий, чтобы понять, что он делает.

while(current != NULL)
{
next = current->spotBehind;

cout << "Before Delete " << current << " Data: " << current->data << endl;
delete current;
cout << "After Delete " << current << " Data: " << current->data << endl;
current = NULL;
cout << "After Null " << current << endl;
current = next;
if(current != NULL)
cout << "After Reassigned " << current << " Data: " << current->data << endl;
}

и я получаю следующие результаты:

Before Delete 0x100103b20 Data: 5
After Delete 0x100103b20 Data: 5
After Null 0x0
After Reassigned 0x100103b30 Data: 10
Before Delete 0x100103b30 Data: 10
After Delete 0x100103b30 Data: 10
After Null 0x0

Поэтому мой большой вопрос заключается в том, действительно ли информация распределяется так, как она должна быть. Я думаю, что делаю что-то не так, потому что после того, как я использую команду «delete» в моем указателе Spot, я все еще могу видеть значение (а также указатель spotBehind) впоследствии. Если это сработало так, как я хотел, не должен ли я увидеть значение мусора и нулевой указатель spotBehind или просто не иметь доступа к данным? Я был бы признателен, если бы кто-то объяснил мне это, и если я делаю это неправильно, кто-то может предложить способ правильного удаления информации?

1

Решение

Я думаю, что ваш код работает, как ожидалось.

что данные все еще присутствуют после удаления, все в порядке, потому что удаление не означает, что они должны быть перезаписаны.
delete только сообщает управлению памяти, что память, на которую указывает указатель, больше не будет использоваться и может быть переназначена. доступ к нему после этой операции недопустим и может привести к неопределенному поведению, но в основном это возможно без каких-либо нарушений доступа, поскольку адрес по-прежнему указывает на кучу приложений.

2

Другие решения

Распределение памяти обычно осуществляется с помощью своего рода связанного списка. Свободное действие помечает блок как доступный для системы.
Вообще, что будет сделано с освобожденной памятью, зависит от компилятора и типа сборки — вы печатали эти значения в Debug of Release?

Например, компилятор MS в режиме отладки заполняет освобожденный блок

memset(pHead, _bDeadLandFill,  // 0xdddddddd

Вот 0xdddddddd это специальное значение, используемое компилятором для отметки освобожденная память.

И попытка распечатать данные удаленного указателя вызывает Access violation ошибка.
Вы можете попробовать отладить operator delete посмотреть, как это реализовано в вашей системе.

2

Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.