LINUX.ORG.RU

list в динамической памяти

 ,


0

1

привет всем! я еще не совсем глубоко изучил stl

у меня вопрос. есть структура, в которой предполагается поле под список( list ).

struct my_struct_s {
	char* name;
	int cnt;
};
struct my_pool_s {
	int a;
	int b;
	list<my_struct> list; // или нужно так  list<my_struct>* list; ?
};
Вопросы такие:
1. экземпляр структуры my_pool_s я аллокирую динамически. Затем инициализирую поля структуры. Как будет правильно сделать для списка в поле этой структуры, иметь указатель на список( list<my_struct>* list; ) или просто как обычно (list<my_struct> list;)
2. как правильно проинициализировать список(пустым) после динамически аллокированной памяти под my_pool_s. т.е. для случая указателя и просто.
3. когда делаю free() для my_pool_s, как перед этим грамотно очистить и освободить список.

помогите пожалуйста разобраться



Последнее исправление: beastie (всего исправлений: 2)

Ответ на: комментарий от qwertyqt

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

note173 ★★★★★
()
Ответ на: комментарий от note173

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

qwertyqt
() автор топика
Ответ на: комментарий от qwertyqt

скажите, а конструкции вида list<my_struct>* list; неправильно использовать?

У Вас идентификатор list вообще то уже занят. Если не интересуют накладные расходы при создании/удалении my_pool_s, то хоть

    list<...> ******************* list_;
но вообще то list<> сам все сделает, нафига его явно динамически размещать то?

А вообще списки зло. Если не предвидится вставка элемента (порядок элементов не важен) лучше юзать вектор с блочным выделением памяти.

AIv ★★★★★
()
Ответ на: комментарий от qwertyqt

Можно просто объявить поле как std::unique_ptr<list<my_struct> > list. Но придется переопределять конструктор копирования и оператор присваивания.

На самом деле, если my_pool_s точно лежит в динамической памяти и никуда не перемещается, то оптимально оставить как есть. Оверхед начинается при перемещении и копировании объекта, при котором будет создана копия списка list.

note173 ★★★★★
()
Ответ на: комментарий от AIv

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

В действительности всё сложнее, вектор лучше работает с кешем, требует меньше динамического распределения памяти. Вообще последовательность по-умолчанию - это std::vector, остальные - после того как профилирование покажет, что std::vector является бутылочным горлышком.

Begemoth ★★★★★
()

когда делаю free() для my_pool_s, как перед этим грамотно очистить и освободить список.

На надо free, делай delete, он отличается тем, что вызывает деструкторы.

my_pool_s *pool = new my_pool_s;
...
...
delete pool;

Для элемента листа лучше использовать std::string

struct my_struct_s {
	string name;
	int cnt;
};
Тогда можно не заботиться о памяти, выделенной под строку: она освободится деструктором класса my_struct_s, который будет вызван деструктором класса list<my_struct_s>.

i-rinat ★★★★★
()
Ответ на: комментарий от Begemoth

Соглашусь. Но вообще между вектором и списком есть куча промежуточных решений, и обычно можно заранее определить бол-мен оптимальный вариант.

AIv ★★★★★
()
Ответ на: комментарий от wota

спасибо всем за ответы

struct my_pool_s* pool;
pool = (struct my_pool_s*)malloc(sizeof(struct my_pool_s));
if(!pool) return;

memset(pool,0,sizeof(struct my_pool_s));

pool->list=new list<struct my_struct_s>(); // тут ошибка

делаю вот так, компилятор ругается. что не так? подскажите

qwertyqt
() автор топика
Ответ на: комментарий от qwertyqt

pool->list=new list<struct my_struct_s>(); // тут ошибка

Нет, не тут.

Begemoth ★★★★★
()
Ответ на: комментарий от qwertyqt

Структура - это тот же класс, но с по-умолчанию открытыми наследованием и членами.

Begemoth ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.