Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Списки STL и освобождение памяти, Если элементом явл. структура с дин.масс 
V
    Опции темы
hoRUS
Дата 28.5.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.5.2007
Где: Москва

Репутация: нет
Всего: нет



Здрасьте всем!

Есть структура

Код

struct TStruktura
{
 double   A;
 double* Arr;
}


Второй элемент структуры предполагает динамический массив, выделяемый оператором, например, new 
Из этих экземпляров этой структуры составляется список list<TStruktura>

Код

...
 list<TStruktura> ListOfTStruktura;
 int NumberOfElements;           //число элементов компонентного массива
 TStruktura Struktura1;
 ...
 Struktura1.A = 0.0;                 //неважно
 Struktura1.Arr = new double[NumberOfElements];
 for(int i = 0; i < NumberOfElements; i++)
  Struktura1.Arr[i] = 0.0;          //неважно 
 ListOfTStruktura.push_back(Struktura1);  
...

Вопрос: происходит ли именно в данном случае полная очистка списка и соответствующей памяти при использовании оператора 
Код

 ListOfTStruktura.clear();

или нужно очищать каждый элемент оператором delete[]:
Код

 list<TStruktura>::iterator ListTOfTStrukturaIterator;
 for(ListTOfTStrukturaIterator = ListTOfTStruktura.begin(); ListTOfTStrukturaIterator != ListTOfTStruktura.end(); ListTOfTStrukturaIterator++)
  delete[] ListTOfTStrukturaIterator -> Arr;
 ListOfTStruktura.clear();


З.Ы. STL только недавно стал изучать, времени нету на завершение этого процесса пока   smile   smile
З.Ы.Ы Пишу в Билдере 10, но в данном случае это, видимо, значения не имеет
Спасибо!
PM MAIL ICQ   Вверх
archimed7592
Дата 28.5.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(hoRUS @  28.5.2007,  23:09 Найти цитируемый пост)
Вопрос: происходит ли именно в данном случае полная очистка списка и соответствующей памяти при использовании оператора 
нет, но происходит деструкция каждого хранимого объекта...
деструктор: то, что тебе нужно...
Код
struct TStruktura
{
 double   A;
 double* Arr;
 ~TStruktura()
 {
     delete[] Arr;
 }
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 30.5.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



имхо, лучше вообще делать так:
Код
#include <vector>
struct TStruktura 
{
    typedef std::vector<double> DoubleVector;
    double A;
    DoubleVector Arr;
};
Тогда и память выделять/освобождать не надо.
PM   Вверх
hoRUS
Дата 30.5.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.5.2007
Где: Москва

Репутация: нет
Всего: нет



bsa
Цитата

имхо, лучше вообще делать так:

А не приведёт ли это к снижению скорости и нерациональному увеличению потребляемой памяти? Максимальная длина массива внутри структуры, как правило, не превышает 5 (до выполнения неизвестно). А я где-то слышал, что при создании вектора выделяется что-то типа 256 элементов и даже больше. В то же время к экземплярам этой структуры очень часто идёт обращение, они часто создаются и удаляются. Скорость очень важна - сложный физический алгоритм, здесь речь идёт не о пресловутых секундах (типа выпендреться, что расчет идет аж "на две секунды быстрее"), а о десятках минут и даже часах, реально нудно ждать.

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

 list<TStruktura>* ListOfTStruktura = new list<TStruktura>;
 
(деструктор TStruktura реализован) вызовет ли оператор
Код

 delete ListOfTStruktura;

деструкторы всех элеметов типа TStruktura?

Спасибо  smile .
PM MAIL ICQ   Вверх
zkv
Дата 30.5.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(hoRUS @  30.5.2007,  18:26 Найти цитируемый пост)
(деструктор TStruktura реализован) вызовет ли оператор
 delete ListOfTStruktura;
деструкторы всех элеметов типа TStruktura?

да

Цитата(hoRUS @  30.5.2007,  18:26 Найти цитируемый пост)
деструктор TStruktura реализован

если деструктор не был реализован самостоятельно, то компилятор сочинит его сам
PM MAIL   Вверх
archimed7592
Дата 30.5.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



hoRUS, если тебе так нужна скорость, то советую присмотреться к memory-poll'ам, а также, если нужна простота использования - к умным указателям: тебе вполне подойдёт шустрый std::auto_ptr с изменённой стратегией удаления(delete obj -> delete[] obj)

ну и, в конце-концов, если нужна просто реактивность, то, можно сделать массив из фиксированного числа эл-ов(5) и хранить их кол-во в отдельном поле(если это нужно - в структуре не хранится кол-во эл-ов для дин.массива Arr).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 30.5.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(zkv @  30.5.2007,  18:42 Найти цитируемый пост)
то компилятор сочинит его сам 


 smile ага, нужно только рифмы подсказать...

P.S. Чего-то меня сегодня пробило, когда же меня отпустит...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 30.5.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



сочинить то сочинит, только делать он будет совсем не то, что должен...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
zkv
Дата 30.5.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(archimed7592 @  30.5.2007,  20:34 Найти цитируемый пост)
сочинить то сочинит, только делать он будет совсем не то, что должен... 

для твоего примера - да, в общем случае ничего нельзя сказать по этому поводу smile
PM MAIL   Вверх
archimed7592
Дата 30.5.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(zkv @  30.5.2007,  20:55 Найти цитируемый пост)
для твоего примера - да, в
пример не мой smile topic-starter - hoRUS smile

в общем случае - конечно, может делать и то, что подразумевается smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
hoRUS
Дата 30.5.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.5.2007
Где: Москва

Репутация: нет
Всего: нет



В общем, спасибо! smile 
Наверно, надо правда подумать насчет статических массивов с пустыми лишними элементами, либо первый вариант. Больше наверно ничего не успею.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1791 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.