Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамические массивы в классе / 24 сообщений из 24, страница 1 из 1
21.03.2005, 10:00
    #32970574
Conner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Доброго времени суток, уважаемые программисты.
У меня следующий вопрос. Почему при работе с динамическим массивом внутри класса возникают проблеммы с деструктором, т.е., когда я вызываю функцию roles->Add(role); 1 или 2 раза, то деструктор выполняется нормално, но стоит мне ей воспользоваться более 2х раз, возникает ошибка Access violation, причём данная ошибка возникает при завершении работы деструктора, т.е. не в самой процедуре ~Role(void), а при выходе из неё. Другими словами ошибка возникает на строчке delete roles; Где roles описывается следующим образом: TRole *roles;
Есть класс, внутри которого находится динамический массив типа hook_role, данный тип имеет следующий вид:

typedef unsigned char u_char;
typedef unsigned short u_short;

typedef struct hook_role
{
u_char protocol;
ip_address4 saddr;
ip_address4 daddr;
u_short sport;
u_short dport;
u_short direct;
} hook_role;

класс имеет следующий вид:

class TRole
{
private:
hook_role *buffer;
int count;
public:
TRole(void);
~TRole(void);
int Add(hook_role role);
};

TRole::TRole(void)
{
count = 0;
buffer = NULL;
}

TRole::~TRole(void)
{
if (count > 0)
{
free(buffer);
count = 0;
}
}

int TRole::Add(hook_role role)
{
int res = -1;
int step = sizeof(hook_role);
int i;
hook_role item;
hook_role *tmp;

if (this->count > 0)
{
tmp = (hook_role *) malloc(step*this->count);
for (i = 0; i < this->count; i++)
{
item = this->buffer[i*step];
tmp[i*step] = item;
}

free(this->buffer);

this->buffer = (hook_role *) malloc(step*(this->count+1));
for (i = 0; i < this->count; i++)
{
item = tmp[i*step];
this->buffer[i*step] = item;
}
this->buffer[this->count*step] = role;
}
else
{
this->buffer = (hook_role *) malloc(step);
this->buffer[0] = role;
}

res = this->count;
this->count++;

return res;
}


ПОЖАЛУЙСТА ПОМОГИТЕ!!!!
...
Рейтинг: 0 / 0
21.03.2005, 10:09
    #32970586
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
А не проще воспользоваться каким-нибудь контейнером из STL ?
...
Рейтинг: 0 / 0
21.03.2005, 10:12
    #32970595
Conner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Не проще, т.к. STL не очень хорошо поддерживаеться MS DDK
...
Рейтинг: 0 / 0
21.03.2005, 10:14
    #32970598
Conner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Да я бы вообще за этот гонимый VC++ никогда бы не сел, если бы не NT DDK.
Если бы в Builder'e или Delphi можно было бы драва писать, работал бы только на них.
Там только чего функция Assigned стоит и т.д. и т.п.
...
Рейтинг: 0 / 0
21.03.2005, 10:58
    #32970702
Динамические массивы в классе
ConnerНе проще, т.к. STL не очень хорошо поддерживаеться MS DDK


Это как это ?
...
Рейтинг: 0 / 0
21.03.2005, 11:02
    #32970715
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Эт у тебя милок ашипка в праграмми. А хде - ни скажу. Иди в канфу па сваиму любимаму Дельфи може там тебе че скажут.

Не ну нармальна а, такие вот ... хм-хм ... таварищи ни толька агульно ругают ТУТ НАШ хароший прадухт, да исче и драйвера садятса писать, а нам с вами патом этими глючными драйвирами пользаваца !!

Ты скажи , пачиму ты память пад новый буфир два раза выдиляишь, а не пять, или семь ? Пачиму так мала, а ? Пачиму капируишь не
Пачиму у тебя толька обработка count == 0 выделена в атдельную ветку, а где все астальные значения count ? 1, 2 3 - их многа ваще, да ?

Кстати, сомневаюсь, что на CBuilder нельзя драйвера писать.
...
Рейтинг: 0 / 0
21.03.2005, 11:03
    #32970717
Conner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
При использовании DDK, используеться также и его компилятор и его библиотеки.
Как следствие, некоторые функции stdlib.h, stdio.h, io.h не работают.
Он сразу начинает ругаться на невозможность импорта-експорта функций из *.lib файлов
...
Рейтинг: 0 / 0
21.03.2005, 11:12
    #32970746
vitvsh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
free(tmp) потерял
может стоить настоящий(!) динамический список использовать, а не копировать элементы в tmp?
...
Рейтинг: 0 / 0
21.03.2005, 11:15
    #32970756
Conner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Не потерял. Он стоит после второго цикла.
Что ты подрозумиваешь под настоящим динамическим списком?
...
Рейтинг: 0 / 0
21.03.2005, 11:19
    #32970772
vitvsh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
ConnerНе потерял. Он стоит после второго цикла.
Что ты подрозумиваешь под настоящим динамическим списком?
я вижу ТОЛЬКО
Код: plaintext
free(this->buffer);
Код: plaintext
free(tmp);
просто нету
...
Рейтинг: 0 / 0
21.03.2005, 11:30
    #32970796
Conner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Просто когда переписывал, забыл вставить:

int TRoles::Add(hook_role role)
{
int res = -1;
int step = sizeof(hook_role);
int i;
hook_role item;
hook_role *tmp;

if (this->count > 0)
{
tmp = (hook_role *) malloc(step*this->count);
for (i = 0; i < this->count; i++)
{
item = this->buffer[i*step];
tmp[i*step] = item;
}

free(this->buffer);

this->buffer = (hook_role *) malloc(step*(this->count+1));
for (i = 0; i < this->count; i++)
{
item = tmp[i*step];
this->buffer[i*step] = item;
}
this->buffer[this->count*step] = role;
free(tmp);
}
else
{
this->buffer = (hook_role *) malloc(step);
this->buffer[0] = role;
}

res = this->count;
this->count++;

return res;
}
...
Рейтинг: 0 / 0
21.03.2005, 11:48
    #32970866
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Ага, и memcpy / memmove нету ?
И вот это :
item = this->buffer[i*step];
tmp[i*step] = item;
ну почему именно так написано ?
Надо было хотя бы так что ли :
item1 = this->buffer[i*step];
item2 = item1;
item3 = item2;
item4 = item3;
item5 = item4;
tmp[i*step] = item5;

А то как-то уж очень просто получается.
...
Рейтинг: 0 / 0
21.03.2005, 11:57
    #32970895
Conner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Функцию memcpy использовать я уже пробовал, но ни чего из этого не вышло, поэтому вернул всё на круги своя,
т.е. без указателей.
...
Рейтинг: 0 / 0
21.03.2005, 13:51
    #32971261
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
int TRole::Add(hook_role role)
{
int res = -1;
hook_role *tmp;

if (count)
{
tmp = (hook_role *) ralloc(sizeof(hook_role)*(count+1));
if (tmp)
buffer = tmp;
else
return res = ERR_NOT_MEM;
}
else
{
buffer = malloc(sizeof(hook_role));
if ( !buffer)
return res = ERR_NOT_MEM;
}
buffer[count] = role;
++count;
return res;
}
...
Рейтинг: 0 / 0
21.03.2005, 13:54
    #32971271
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
realloc, разумеется - описался там.
И из соображений минимализации я бы структуру бы упаковал
#pragma pack(1)
....
#pragma pack()
это имеет смысл, если count порядка 10000 - всё же драйвер.
...
Рейтинг: 0 / 0
21.03.2005, 16:46
    #32971842
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
А это С++ или Си ? почему malloc и free а не new и delete ? Кстати вызов delete NULL - не вызывает ошибки.
...
Рейтинг: 0 / 0
21.03.2005, 20:08
    #32972295
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
dwl
А это С++ или Си ? почему malloc и free а не new и delete ? Кстати вызов delete NULL - не вызывает ошибки.


Уж лучше бы спросили, почему не LocalAlloc/LocalFree. Драйвер же все-таки.
И что не получилось в memcpy использовать ?
Ассемблерную комманду очень тяжело "не смочь использовать".
...
Рейтинг: 0 / 0
21.03.2005, 20:14
    #32972302
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Кстати, уже без хохмы - free и malloc и иже с ними может быть в драйвере и нельзя вообще использовать. Это все из CRTL, а она, как известно, не совсем реентерабельная, или вернее говоря, условно реентерабельная.
Да и статические данные CRTL наверное в пользовательской памяти лежат, а не в той, где драйвер работать должен.

Ты кстати, какую RTL- то используешь (или вернее , пытаешься использовать)? DLL, многопоточную ?
А в DDK что про использование CRTL написано ?
...
Рейтинг: 0 / 0
22.03.2005, 12:32
    #32973330
nikname
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Драйвер есть смысл линковать с ключём /MT - multithread static link.
Информация насчёт нереентерабельности CRTL на которой написан UNIX и Linux кажется мне сильно преувеличенной.
Наличие статических переменных в динамической разделяемой билиотеке - тож, как минимум все статические переменные должны храниться у клиента иначе не вполне понятно, как динамическая память будет отводиться в адресном пространстве клиента. Это - если мы говорим о динамической CRTL.
...
Рейтинг: 0 / 0
22.03.2005, 14:22
    #32973736
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Код: plaintext
int Add(hook_role role);
несколько не оптимально. Достаточно большая структура будет создана в стеке. Может быть стоит попробовать ссылки?

Далее
Код: plaintext
1.
2.
3.
4.
5.
for (i =  0 ; i < this->count; i++)
{
item = this->buffer[i*step];
tmp[i*step] = item;
}
могу предложить одну из альтернатив
Код: plaintext
1.
std::copy( this->buffer, this->buffer+this->count, tmp );

Далее
Код: plaintext
1.
this->buffer = (hook_role *) malloc(step*(this->count+ 1 ));
Я бы попробовал сразу выделять для tmp на размер больше объем, а после
Код: plaintext
1.
this->buffer = tmp;

Мелочь
Код: plaintext
1.
2.
3.
4.
res = this->count;
this->count++;

return res;
можно наверное так
Код: plaintext
1.
return this->count++;

Вопросик на засыпку. Никогда не писал дрова на сях. Там обработка исключений или исключения есть ваще? или только SEH? Если есть, то что происходит если в теле функции драйвера возникает исключение и оно не обработано. Как проявит себя в этом случае драйвер?

Вопрос номер два. Если дрова идут как MT, тогда функция-член Add не многозадачна. Точнее она не приспособлена для мнооьопоточной работы.

Вопрос номер три. Может быть стоит рассмотреть вариант использования списка (двусвязный, односвязный), меньше возни с копированием.
...
Рейтинг: 0 / 0
22.03.2005, 16:16
    #32974127
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
nikname
Информация насчёт нереентерабельности CRTL на которой написан UNIX и Linux кажется мне сильно преувеличенной.


Это в любом учебнике написано (например, Джефри Рихтер). Да и на счет "написан UNIX и Linux" - а) не все написано на CRT, б) надо уметь писать, знать, где можно применять CRT, а где нельзя. Короче, прочитайте хоть в MSDN. Да и в конце концов само существование разных библиотек для MT и ST говорит об этом. Да прочитайте хоть описание функции beginthreadex.

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

Да не понятно, как вообще heap будет работать внутри кода драйвера. Сам heap уже статическая структура, след. все, что ее использует, будет нереентерабельно (без доп. усилий).
...
Рейтинг: 0 / 0
22.03.2005, 20:24
    #32974757
zuzu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
а почему тогда не зарезервировать себе куск памяти и работать с ним, ну если ето девайс,
а вообсще лутше выделяь память страницами по мере надобности, и чтобы одна страница вмещала допустим 32 элемента и юзать список из этих страниц.
...
Рейтинг: 0 / 0
30.03.2005, 15:01
    #32988844
Dubrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
dwl ... Кстати вызов delete NULL - не вызывает ошибки.
Вызов free(NULL) - тоже (см. Стандарт C).
---
C уважением, Dubrov.
...
Рейтинг: 0 / 0
31.03.2005, 08:23
    #32990067
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические массивы в классе
Тогда зачем так писать в ДЕСТРУКТОРЕ
Код: plaintext
1.
2.
3.
4.
5.
if (count >  0 )
{
free(buffer);
count =  0 ; 
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамические массивы в классе / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]