|
|
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток, уважаемые программисты. У меня следующий вопрос. Почему при работе с динамическим массивом внутри класса возникают проблеммы с деструктором, т.е., когда я вызываю функцию 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; } ПОЖАЛУЙСТА ПОМОГИТЕ!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 10:00 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
А не проще воспользоваться каким-нибудь контейнером из STL ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 10:09 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Не проще, т.к. STL не очень хорошо поддерживаеться MS DDK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 10:12 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Да я бы вообще за этот гонимый VC++ никогда бы не сел, если бы не NT DDK. Если бы в Builder'e или Delphi можно было бы драва писать, работал бы только на них. Там только чего функция Assigned стоит и т.д. и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 10:14 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
ConnerНе проще, т.к. STL не очень хорошо поддерживаеться MS DDK Это как это ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 10:58 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Эт у тебя милок ашипка в праграмми. А хде - ни скажу. Иди в канфу па сваиму любимаму Дельфи може там тебе че скажут. Не ну нармальна а, такие вот ... хм-хм ... таварищи ни толька агульно ругают ТУТ НАШ хароший прадухт, да исче и драйвера садятса писать, а нам с вами патом этими глючными драйвирами пользаваца !! Ты скажи , пачиму ты память пад новый буфир два раза выдиляишь, а не пять, или семь ? Пачиму так мала, а ? Пачиму капируишь не Пачиму у тебя толька обработка count == 0 выделена в атдельную ветку, а где все астальные значения count ? 1, 2 3 - их многа ваще, да ? Кстати, сомневаюсь, что на CBuilder нельзя драйвера писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 11:02 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
При использовании DDK, используеться также и его компилятор и его библиотеки. Как следствие, некоторые функции stdlib.h, stdio.h, io.h не работают. Он сразу начинает ругаться на невозможность импорта-експорта функций из *.lib файлов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 11:03 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
free(tmp) потерял может стоить настоящий(!) динамический список использовать, а не копировать элементы в tmp? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 11:12 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Не потерял. Он стоит после второго цикла. Что ты подрозумиваешь под настоящим динамическим списком? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 11:15 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
ConnerНе потерял. Он стоит после второго цикла. Что ты подрозумиваешь под настоящим динамическим списком? я вижу ТОЛЬКО Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 11:19 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Просто когда переписывал, забыл вставить: 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; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 11:30 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Ага, и 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; А то как-то уж очень просто получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 11:48 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Функцию memcpy использовать я уже пробовал, но ни чего из этого не вышло, поэтому вернул всё на круги своя, т.е. без указателей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 11:57 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
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; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 13:51 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
realloc, разумеется - описался там. И из соображений минимализации я бы структуру бы упаковал #pragma pack(1) .... #pragma pack() это имеет смысл, если count порядка 10000 - всё же драйвер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 13:54 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
А это С++ или Си ? почему malloc и free а не new и delete ? Кстати вызов delete NULL - не вызывает ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 16:46 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
dwl А это С++ или Си ? почему malloc и free а не new и delete ? Кстати вызов delete NULL - не вызывает ошибки. Уж лучше бы спросили, почему не LocalAlloc/LocalFree. Драйвер же все-таки. И что не получилось в memcpy использовать ? Ассемблерную комманду очень тяжело "не смочь использовать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 20:08 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Кстати, уже без хохмы - free и malloc и иже с ними может быть в драйвере и нельзя вообще использовать. Это все из CRTL, а она, как известно, не совсем реентерабельная, или вернее говоря, условно реентерабельная. Да и статические данные CRTL наверное в пользовательской памяти лежат, а не в той, где драйвер работать должен. Ты кстати, какую RTL- то используешь (или вернее , пытаешься использовать)? DLL, многопоточную ? А в DDK что про использование CRTL написано ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 20:14 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Драйвер есть смысл линковать с ключём /MT - multithread static link. Информация насчёт нереентерабельности CRTL на которой написан UNIX и Linux кажется мне сильно преувеличенной. Наличие статических переменных в динамической разделяемой билиотеке - тож, как минимум все статические переменные должны храниться у клиента иначе не вполне понятно, как динамическая память будет отводиться в адресном пространстве клиента. Это - если мы говорим о динамической CRTL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2005, 12:32 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Далее Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. Далее Код: plaintext 1. Код: plaintext 1. Мелочь Код: plaintext 1. 2. 3. 4. Код: plaintext 1. Вопросик на засыпку. Никогда не писал дрова на сях. Там обработка исключений или исключения есть ваще? или только SEH? Если есть, то что происходит если в теле функции драйвера возникает исключение и оно не обработано. Как проявит себя в этом случае драйвер? Вопрос номер два. Если дрова идут как MT, тогда функция-член Add не многозадачна. Точнее она не приспособлена для мнооьопоточной работы. Вопрос номер три. Может быть стоит рассмотреть вариант использования списка (двусвязный, односвязный), меньше возни с копированием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2005, 14:22 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
nikname Информация насчёт нереентерабельности CRTL на которой написан UNIX и Linux кажется мне сильно преувеличенной. Это в любом учебнике написано (например, Джефри Рихтер). Да и на счет "написан UNIX и Linux" - а) не все написано на CRT, б) надо уметь писать, знать, где можно применять CRT, а где нельзя. Короче, прочитайте хоть в MSDN. Да и в конце концов само существование разных библиотек для MT и ST говорит об этом. Да прочитайте хоть описание функции beginthreadex. nikname Наличие статических переменных в динамической разделяемой билиотеке - тож, как минимум все статические переменные должны храниться у клиента иначе не вполне понятно, как динамическая память будет отводиться в адресном пространстве клиента. Это - если мы говорим о динамической CRTL. Да не понятно, как вообще heap будет работать внутри кода драйвера. Сам heap уже статическая структура, след. все, что ее использует, будет нереентерабельно (без доп. усилий). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2005, 16:16 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
а почему тогда не зарезервировать себе куск памяти и работать с ним, ну если ето девайс, а вообсще лутше выделяь память страницами по мере надобности, и чтобы одна страница вмещала допустим 32 элемента и юзать список из этих страниц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2005, 20:24 |
|
||
|
Динамические массивы в классе
|
|||
|---|---|---|---|
|
#18+
dwl ... Кстати вызов delete NULL - не вызывает ошибки. Вызов free(NULL) - тоже (см. Стандарт C). --- C уважением, Dubrov. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 15:01 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32971842&tid=2033530]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 339ms |

| 0 / 0 |
