Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ Builder, выделение памяти

Автор: Static
Дата сообщения: 03.01.2007 15:36
День добрый!

Требуется помощь в области динамического выделения памяти переменным. Ситуация следующая:
Есть структура, в эту структуру заносится база данных. Изначально я делал так:

struct a {
char m1[y1];
char m2[y2];
...
char mn[yn];
} A[1024];


где m1, m2... mn - поля базы данных, y1, y2... yn - длины полей.

Но это, сами понимаете, перерасход памяти. Нужно, чтобы во-первых, было автоматическое выделение памяти только под нужное количество записей БД, а не сразу под все 1024 штуки.

Во-вторых, я решил, что вместо списка полей, лучше использовать двумерный массив char [x][y], где x - номер поля БД, y - длина поля (чтобы можно было сортировать БД по любому полю). Нужно, чтобы для этого массива также динамически выделялась память (количество полей может быть фиксированным, предположим 32).

Темы про динамическое распределение памяти я прочитал, но тем не менее, запутался конкретно. Помогите плз.
Автор: vertex4
Дата сообщения: 03.01.2007 15:49

Код:
char **m=new char *[x];
for (int i=0;i<x;i++)
m[i]= new char [y];

//Не забыть освободить память после завершения работы с полями
delete [] m;
Автор: Static
Дата сообщения: 03.01.2007 16:33
Со структурой это все дело не стыкуется.
В общем, вот я создал структуру:

struct FILM {
char **x;
} ;


Далее, я под нее выделяю память:
FILM *F = new FILM;


Предположим, пока одна запись, начинаем выделять память под **x.

F[0].x = new char *;
for (int i=0; i<6; i++)
F[0].x[i] = new char;

Потом при тестовом заполнении полей:
for (int i=0; i<6; i++)
strcpy(F[0].x[i], "VAR");

...оно выдает ошибку.
Где я мог напортачить?
Автор: WiseAlex
Дата сообщения: 03.01.2007 16:39
Static
А зачем тебе все эти сложности с new ?
есть stl с ее string и vector там все динамическое выделение уже за тебя сделали. Да и в VCL есть наверное свои контейнеры (типа AnsiString)
Автор: xokc
Дата сообщения: 03.01.2007 17:37
Интересно, выделяешь под 1 символ:

Цитата:
F[0].x[i] = new char;

а копируешь 4

Цитата:
strcpy(F[0].x[i], "VAR");

нехорошо!
Автор: Static
Дата сообщения: 06.01.2007 19:20
А как вообще правильно выделять память под структуру? Вот допустим добавляю в структуру очередную запись, под неё каждый раз выделять память? Как это ПРАВИЛЬНО делается? А то у меня прога после примерно 6-й или 7-й записи начинает ругаться.
Автор: Arion
Дата сообщения: 08.01.2007 15:12
Как правило, при создании структуры заранее выделяется определенный обьем памяти. При добавлении новых данных проверяется переполнение буфера и если оно происходит - осуществляется увеличение размера буфера, обычно в 2 раза.

Цитата:
for (int i=0; i<6; i++)
F[0].x[i] = new char;

Так делать не стоит, во первых это очень неэкономное расходование памяти, во вторых - очень медленно.
Нужно писать:

Код:
int nSize = 10;
F[0].x = new char[nSize];

Страницы: 1

Предыдущая тема: Предлагаю зароботок для Программиста, работа с дома.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.