C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как динамически создать массив???, траблы с выделением памяти
Dimon.Ru
Отправлено: 17.06.2004, 11:16


Станционный диспетчер

Группа: Участник
Сообщений: 92



Возникла необходимость создать таблицу, а которой можно работать примерно как с таблицей базы данных.
я сделал класс, описывающий ячейку таблицы (MyField), затем класс, который описывает строку (MyRecord).
в строке необхлдимо выделить память под ячейки.

В h-файле пишу так:
MyRecord{
...
MyField *Fields[1024];
...
};

в cpp-файле — так:
MyRecord::MyRecord(unsigned long fCount)
{
unsigned long count;
if(fCount>1024)
{count=1024;}

else count=fCount;
for(unsigned long i=0; i {// Выделяем память под поля
Fields[i] = new MyField;
Fields[i]->SetIndex(i);
}
return;
}

дальше просто для теста создаю запись с каким-то количеством полей? например — 21:

MyRecord *zapis = new MyRecord(21);

присваиваю им значения, читаю значения и т.д.
Все работает, но при закрытии формы — access violation....
что самое интересное, когда я то же самое писан не в конструкторе класса, а просто создавал массив переменных класса MyField — то все работало нормально, но стоило вставить это дело в класс...
olegenty
Отправлено: 17.06.2004, 11:52


Ветеран

Группа: Модератор
Сообщений: 2412



а удаляешь-то где и как?

а почему бы не воспользоваться TRxMemoryData или TkbmMemTable?

и жесткая привязка к числу 1024 не нравится...

а vector, наконец, чем плох?
Gedeon
Отправлено: 17.06.2004, 13:38


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (olegenty @ 17/06/2004, 12:54)
а vector, наконец, чем плох?

Вот его родимого как раз и надо использовать.
pagan
Отправлено: 17.06.2004, 13:42


Ученик-кочегар

Группа: Участник
Сообщений: 22



Для начала хотелось бы увидеть полное объявление класса (ну или хотя бы частичное — особенно деструктор)
QUOTE
а vector, наконец, чем плох?

тогда уж map, если конечно уникальный ключ будет не составным.
Ну а если опыта в STL мало, то может лучше попробовать VCL::TCollection.

Отредактировано pagan — 17/06/2004, 14:45
olegenty
Отправлено: 17.06.2004, 16:01


Ветеран

Группа: Модератор
Сообщений: 2412



ну ну... никаких TCollection, он не для этого предназначен...
AVC
Отправлено: 17.06.2004, 16:16


Ветеран

Группа: Модератор
Сообщений: 1583



Хочу вставить свои 5 коп. Для динамических массивов динамических структур а с успехом использую TList. Ни каких объявлений тип new arr[xx] только методы Add, Delete и Clear. Компонент на базе TList, реализующий поставленную задачу работает у меня уже не один год без сбоев.
olegenty
Отправлено: 18.06.2004, 07:05


Ветеран

Группа: Модератор
Сообщений: 2412



но у ТList существенный недостаток — когда объектов TList много — память, что откусывает TList, несоизмеримо больше памяти, что расходуется на реально-хранимые объекты... (я оперировал десятками тысяч TList)
AVC
Отправлено: 18.06.2004, 07:53


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

память, что откусывает TList, несоизмеримо больше памяти, что расходуется на реально-хранимые объекты

CODE

TList stores an array of pointers. (Help)

TList это просто список указателей допополнительный расход памяти может быть только из за указуемых элементов.
olegenty
Отправлено: 18.06.2004, 07:57


Ветеран

Группа: Модератор
Сообщений: 2412



разберусь — отвечу подробней. когда ушёл от TList, прога стала пользовать на 20 MB меньше памяти.
pagan
Отправлено: 18.06.2004, 08:05


Ученик-кочегар

Группа: Участник
Сообщений: 22



QUOTE
ну ну... никаких TCollection, он не для этого предназначен...

Ладно, согласен — погорячился sad.gif вот только привязываться к компонентам я бы тоже не стал. Ну а если использовать VCL, то вариантов много : это и TList, и TStrings etc.

P.S. лично я бы использовал STL
olegenty
Отправлено: 18.06.2004, 08:43


Ветеран

Группа: Модератор
Сообщений: 2412



вопрошающего на это и наталкивают. smile.gif

хотя, если элементов мало...

CODE

template <class C> class PACKAGE CListFlat
{
public:
   TList *m_pItems;
   __fastcall CListFlat() {m_pItems = new TList();};
   __fastcall ~CListFlat() {delete m_pItems;};

   inline void __fastcall Add(C pItem) {m_pItems->Add(pItem);};
   inline int __fastcall Count() {return m_pItems->Count;};
   inline C __fastcall Items(int i) {return reinterpret_cast<C>(m_pItems->Items[i]);};
   inline C __fastcall Last() {return reinterpret_cast<C>(m_pItems->Last());};
};

template <class C> class PACKAGE CList
{
public:
   TList *m_pItems;
   __fastcall CList() {m_pItems = new TList();};
   __fastcall ~CList() {for (int i = 0; i < m_pItems->Count; i++)
                        {
                            if (m_pItems->Items[i])
                            {
                                delete reinterpret_cast<C>(m_pItems->Items[i]);
                            }
                        }
                        delete m_pItems;};

   inline void __fastcall Add(C pItem) {m_pItems->Add(pItem);};
   inline int __fastcall Count() {return m_pItems->Count;};
   inline C __fastcall Items(int i) {return reinterpret_cast<C>(m_pItems->Items[i]);};
   inline C __fastcall Last() {return reinterpret_cast<C>(m_pItems->Last());};
};


и не париться. замечу, этот темплейт предназначен для работы с указателями. int, например, туда не подставить... но мне хватало, а для int был свой класс, с сортировкой и поиском методом бисекции
Dimon.Ru
Отправлено: 18.06.2004, 15:34


Станционный диспетчер

Группа: Участник
Сообщений: 92



1.
QUOTE
а удаляешь-то где и как?

а почему бы не воспользоваться TRxMemoryData или TkbmMemTable?

и жесткая привязка к числу 1024 не нравится...

а vector, наконец, чем плох?


Удаляю-то???
просто:
CODE
просто delete[] Fields;

разве не правильно???

и потом, когда я делал это не в деструкторе класса, то ошибки не было...

2. честно говоря, я не хотел бы использовать RX-компоненты, а обойтись стандартными типами: в идеале — вместо AnsiString — char...

3. а что такое vector и с чем его едят???

Вернуться в Вопросы программирования в C++Builder