управление памятью в связанном списке - PullRequest
1 голос
/ 27 апреля 2009

Как я могу освободить связанный список, содержащий динамически размещенные объекты? Я пытаюсь использовать списки list<class*>, но потом не могу использовать функцию insert() для вставки объекта в список. Кто-нибудь знает в чем причина?

Ответы [ 8 ]

3 голосов
/ 27 апреля 2009

std::list<boost::shared_ptr<YourType> > автоматически вызовет YourType::~YourType для каждого (умного) указателя в списке, когда список будет удален. И если вы удалите один элемент списка, он вызовет YourType::~YourType для этого одного элемента. Вы все еще можете позвонить list.insert(new YourType)

Ссылка: www.boost.org

2 голосов
/ 27 апреля 2009

как я могу освободить связанный список, содержащий динамически размещенный объект?

Пройдите по списку, удалив содержащийся объект для каждой ссылки, или лучше в некоторых случаях напишите ссылку dtor, которая удалит содержащийся объект.

Я пытаюсь использовать списки списков, но тогда я не смог использовать функцию insert () для вставки объекта в список. Кто-нибудь знает в чем причина?

Не без вашего кода.

1 голос
/ 27 апреля 2009

Перейдите список от начала до конца и удалите по одному.

1 голос
/ 27 апреля 2009

Решение, используемое STL, состоит в том, чтобы контейнер владел объектами, которые он содержит. В этом сценарии каждый узел будет отвечать за освобождение своего объекта при вызове его деструктора. Вы все еще несете ответственность за освобождение копии объекта, который вы передаете.

Редактировать

Если вы пытаетесь использовать stl List и сталкиваетесь с ошибкой, возможно, в этом случае объект, который вы пытаетесь поместить внутрь, не реализует конструктор копирования. Это может произойти, если вы попытаетесь вставить в список другие элементы, кроме указателей. Если вам удобны указатели, вы можете хранить их в своих контейнерах вместо самих объектов. Это потребует, чтобы вы сами вызвали «delete» на указателе, когда закончите с ним. Обычно это делается путем вызова «delete» для указателя, содержащегося в узле, когда вы удаляете его, или путем обхода списка, когда вы закончили с ним, и вызова «delete» для содержимого каждого узла.

0 голосов
/ 27 апреля 2009

Вы можете использовать ptr_list из Boost

http://www.boost.org/doc/libs/1_38_0/libs/ptr_container/doc/ptr_list.html

0 голосов
/ 27 апреля 2009

РЕДАКТИРОВАТЬ: ЭТО НЕПРАВИЛЬНО, К сожалению

Если вы используете std :: list, тогда есть понятная функция для удаления всех объектов, которые вы вставили. тест std :: list; test.clear (); Да, и .clear () также вызывает деструкторы. Чтобы использовать функцию вставки таких списков, вам нужно указать позицию с помощью итератора. test.insert (test.end (), 5); Но есть более 1 функции вставки, здесь вы можете найти более подробную информацию

EDIT

Может ли кто-нибудь оставить комментарий при понижении голосов?

0 голосов
/ 27 апреля 2009

Вам придется выполнить итерации списка и delete динамически распределенных объектов, прежде чем очистить список.

При использовании контейнеров с новыми указатели, пожалуйста, не забудьте удалить указатели перед контейнером уничтожены.

О проблеме с использованием insert(): Я не очень уверен, с какой проблемой вы столкнулись. Из объяснения, я полагаю, вы пытаетесь вставить объекты Class в список, где в списке содержится указатель на Class. Не могли бы вы уточнить проблему со вставкой?

Псевдокод для удаления динамически размещаемых объектов:

версия 1: простая

list<Class*>::const_iterator iter = m_ClassList.begin();
list<Class*>::const_iterator endIter = m_ClassList.end();
for(;iter!= endIter ; ++iter)
{
   delete *iter;
}
ClassList.clear();

версия 2: лучшая версия с использованием for_each

struct DeleteClassObject 
{
  //Functor
  template<typename T>
  void operator()(const T* ptr) const
  {
      delete ptr;
   }
}
//loops through list and deletes the dynamically allocated objects using
//functor DeleteClassObject
for_each( m_ClassList.begin(), m_ClassList.end(), DeleteClassObject ());
DeleteClassObject.clear()
0 голосов
/ 27 апреля 2009

Запустите ваш проект на языке / среде, в котором есть автоматическое управление памятью (Сборка мусора). Тогда подобные вещи будут наименьшим, что вас волнует. Это сэкономит ваше время, чтобы приложить усилия к чему-то другому.

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