2013-05-17 2 views
0

Мне пришлось создать структуру типа связанного списка, которая использует STL. В нем есть метод, который должен удалять объекты из этой связанной структуры списков. В настоящее время у меня есть метод, который снова привязывает таблицу обратно, но я не уверен, что я действительно правильно удаляю объект из памяти. Я в настоящее время сделать следующее:Удаление элемента в месте указателя из памяти C++?

myItem* item = current; //Current position and item to be deleted. 

/* Code to move all elements around */ 

current = current->next; //Move current position along one in the list. 

delete item; 

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

Я сделал немного прибегая к помощи и попытался добавить команду удалить [], но затем я получаю ошибку сегментации, я редактировал свой код, чтобы выглядеть следующим образом:

myItem* item = current; //Current position and item to be deleted. 

/* Code to move all elements around */ 

current = current->next; //Move current position along one in the list. 

delete[] item; //Deletes item at memory location 

delete item; //Deletes temporary pointer 

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

ответ

1

Что вы делаете правильно. Указатель - это просто адрес памяти, и значение копируется в эту локальную переменную.

Например, current является указателем myItem*, и он может указывать на адрес 0XCDEF. Когда вы выполняете назначение, такое как myItem* item = current, этот адрес памяти копируется, поэтому теперь item имеет значение 0XCDEF.

И поэтому, когда вы удалите этот указатель, что просто означает, что ваша программа говорит операционной системы «Эй, я больше не нужно это пространство на 0XCDEF, пожалуйста, очистить его для меня»

+0

Счастливые дни! Приятно видеть, что я правильно понимаю, я просто хотел убедиться, что так оно и было. Когда вы впервые начинаете работать с указателями, все может немного запутаться. Я приму это через 3 минуты! : D – Scott

1

Первый фрагмент кода в порядке. Когда вы делаете

delete item; 

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

Ключевое слово delete[] предназначено для удаления массивов, оно указывает C++ на поиск длины массива, которая начинается с того, на что указывает указатель, и удаляет все элементы в массиве. В этом случае вы должны использовать delete, если, конечно, элементы в вашем списке ссылок не являются массивами.

Кроме того, как отмечалось выше, вы должны убедиться, что объекты, на которые указывает, создаются с помощью ключевого слова new. Всегда пара new с delete, new TYPE[] с delete[] и, если вы по какой-либо причине используете копии C в своем коде, malloc()/calloc() с free().

0

Если ток был создан «новый», вы, вероятно, безопасны.

Если вы не уверены, используйте Valgrind. Это действительно удобно, но вы должны попытаться лучше понять свои концепции языка.

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