Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с выделением памяти  (Прочитано 24363 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Fg99
Гость
« : 28-01-2007 14:27 » 

После третьего вызова функции присходит ошибка
"Access violation at address 00000000. Read of address 00000000."
Выделяю память так:
BYTE Mac[6] = { 0, 0, 0, 0, 0, 0};
   DWORD   Len = 6;
вызов:
         SendARP( ipAddr, 0, (PULONG)&Mac, &Len);
Освобождаю:
   delete [] Mac;
Проблема точно с Mac[]. Тип его менял, но тот же эффект - три раза и вылет. Может кто подскажет что делаю нетак.
Спасибо.
« Последнее редактирование: 28-01-2007 14:31 от Fg99 » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 28-01-2007 14:45 » 

Fg99, неправильно делаешь!
delete - оператор освобождения динамически выделяемой памяти, а для Mac[] память выделяется автоматически. Это разные методы. Автоматическая память сама освобождается при выходе из ф-ии.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Fg99
Гость
« Ответ #2 : 28-01-2007 16:16 » 

Спасибо. Да, конечно. Присобачил такое удаление, ибо не мог понять где ошибка.
Без delete[] ни чего не изменилось - ровно три вызова и всё тут.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 28-01-2007 16:25 » 

Fg99,
SendARP( ipAddr, 0, (PULONG)&Mac, &Len);

 - точно амперсенд нужен?
Записан

tishka17
Участник

ru
Offline Offline
Не разбрасывайте мусор


« Ответ #4 : 28-01-2007 16:32 » 

приведи код, как ты работаешь с этим массивом в самой функции...
ты гдето обращаешься к указателю, который равен NULL
« Последнее редактирование: 28-01-2007 16:33 от tishka17 » Записан

//1001101010110100010100110011101111000010110111010101110011
Fg99
Гость
« Ответ #5 : 28-01-2007 16:48 » 

tishka17, ошибка происходит при вызове самой функции.
Алексей1153++, да.
Но почему именно три раза? По идее все параметры уничтожаются, ошибки подгрузки библиотеки или ф-ии исключаются.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 28-01-2007 16:51 » 

Fg99, а зачем тебе указатель на переменную, хранящую адрес начала массива?  Нипаняяятнаа.
Записан

Fg99
Гость
« Ответ #7 : 28-01-2007 18:39 » new

хз Отлично Запарился. Фишка в том, что работало всё еще несколько часов назад.
Вот пример:
Код:
//где тут тег типа CODE?
//-----
PMIB_IFTABLE ifTbl;
ULONG dwSize = 0;
DWORD dwRetVal = 0;

ifTbl = (MIB_IFTABLE*) malloc(sizeof(MIB_IFTABLE));

if (GetTable(ifTbl, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
  free(ifTbl);
  ifTbl = (MIB_IFTABLE *) malloc (dwSize);
}

if ((dwRetVal = GetTable(ifTbl, &dwSize, 0)) == NO_ERROR) {
   for (int i = 0; i<ifTbl->dwNumEntries;i++)
       {
         String s = (char*)ifTbl->table[i].bDescr;
         String t1 =(String)IntToHex(ifTbl->table[i].bPhysAddr[0],2);
        /*String str = (String)IntToHex(ifTbl->table[i].bPhysAddr[0],2)
                     IntToHex(ifTbl->table[i].bPhysAddr[0],2)+":"+
                     IntToHex(ifTbl->table[i].bPhysAddr[1],2)+":"+
                     IntToHex(ifTbl->table[i].bPhysAddr[2],2)+":"+
                     IntToHex(ifTbl->table[i].bPhysAddr[3],2)+":"+
                     IntToHex(ifTbl->table[i].bPhysAddr[4],2)+":"+
                     IntToHex(ifTbl->table[i].bPhysAddr[5],2)+ " | ";
        str = (String)str + (ifTbl->table[i].dwInOctets/8) + " | ";
        str = (String)str + (ifTbl->table[i].dwOutOctets/8);
        mmt->Lines->Add(str);   */
       }
}
//.........

Тоже не бог весть какая ошибка. Правда, не при вызове, а при обращении к bPhysAddr или bDescr. Функция отрабатывает отлично. Если не через ss, а просто Add()(TMemo), то ошибка 100%. А так - катит. t1-уже ошибка опять. Ни черта не понимаю. Ведь все работало. Главное, другие программы(вообще сторонних производителей) отрабатывают отлично. Пипец...
« Последнее редактирование: 28-01-2007 19:13 от Алексей1153++ » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 29-01-2007 06:09 » 

попробуй сделать, так как написано вот тут
http://msdn2.microsoft.com/en-us/library/aa366358.aspx
обрати внимание на то что буфер перед вызовом зачищают и 4-й параметр переустанавливают
он IN/OUT
кстати вот это (char*) не хорошо и даже плохо используй конструкции C++ а не C

кстати в каком потоке это String s = (char*)ifTbl->table.bDescr; выполняется?
Записан

Странно всё это....
Fg99
Гость
« Ответ #9 : 29-01-2007 09:44 » 

кстати вот это (char*) не хорошо и даже плохо используй конструкции C++ а не C
кстати в каком потоке это String s = (char*)ifTbl->table.bDescr; выполняется?
1)почему же? явное преобразование...2)не понял вопроса=)
LogRus, спасибо за ответ. На счет кода МСДН - с него и начиналось всё когда-то. Однако коду на МСДН верить нужно осторожно, т.к. большинство содержит ошибки, как и в случае SendARP(). Но все-равно спасибо,
буфер перед вызовом зачищают и 4-й параметр переустанавливают
ты совершенно прав, а я в панике Отлично уже забыл об этом.Что получится - отпишу.
Записан
Fg99
Гость
« Ответ #10 : 29-01-2007 11:26 » 

нет. Ни какого эффекта. Не понимаю в чем проблема. А проект МСДН вообще не компилируется, кстати.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #11 : 29-01-2007 13:33 » 

1)почему же? явное преобразование...2)не понял вопроса=)
LogRus, спасибо за ответ. На счет кода МСДН - с него и начиналось всё когда-то. Однако коду на МСДН верить нужно осторожно, т.к. большинство содержит ошибки, как и в случае SendARP(). Но все-равно спасибо,
буфер перед вызовом зачищают и 4-й параметр переустанавливают
ты совершенно прав, а я в панике Отлично уже забыл об этом.Что получится - отпишу.
1) не хорошо потому, что в коде это преобразование в глаза не бросается лучше C++ static_cast, dynamic_cast их явно видно в коде и не даёт ворнингов в аутпут, у нас в контере требование, ворнингов быть не должно
2)поток GUI или дополнительный
3) пример со страницы компилится и работает поставил в код цикл 100 итераций прошли успешно, ты случайно не забыл линковщику сказатать брать библиотечки ws2_32.lib and iphlpapi.lib
Записан

Странно всё это....
Fg99
Гость
« Ответ #12 : 30-01-2007 17:26 » 

1) дык и так нет варнингов, да и привычка ужо=). На счет визуального восприятия-учту, спасибо.
2)GUI
3)ты про МСДН? хммм... Да, конечно линковал. Пробовал вручную описывать структуры и подгружать функцию из библиотеки - вот тогда получалось. Впрочем, и в приведенных примерах функции описаны мной, а не подключением хелпер.h. Надо попробовать чрез .h, вдруг в этом прблема? Хотя вряд ли... Жаль ближайшие лни некогда будет разбираться с этим, но как пойдет дело отпишу.
Спасибо, что не оставляете тему без внимания Отлично .
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 30-01-2007 17:47 » 

Fg99, дело не только в визуальном восприятии но и в возможности поиском найти все точки явных преобразований особенно полезно когда преходишь на другую платформу.
2) прекрасно Улыбаюсь
3) а вот руками ты зря структуры описываешь

насчет не оставлять без внимания это от тебя зависит Ага
Записан

Странно всё это....
zubr
Гость
« Ответ #14 : 30-01-2007 18:15 » 

В общето IntToHex возвращает тип AnsiString, похоже преобразование типов AnsiString в string и вызывает ошибку.
Записан
Fg99
Гость
« Ответ #15 : 30-01-2007 18:23 » 

zubr, String == AnsiString Улыбаюсь
LogRus, 3) почему?
Записан
Fg99
Гость
« Ответ #16 : 30-01-2007 18:25 » 

Там преобразование (String) идет, чтоб дать понять что я вовсе не хочу складывать "строки", а склеивать их и результат - строка.
//не знаю как это по-русски объяснить Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 30-01-2007 18:28 » 

Fg99,
Код:
str = (String)str + (ifTbl->table[i].dwInOctets/8)
--------------------->
str = ((String)str) + (String)(ifTbl->table[i].dwInOctets/8)

а попробуй приоритеты поставить скобками поточнее... Хотя может и так оно правильно, но сразу не очевидно
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #18 : 31-01-2007 07:16 » 

LogRus, 3) почему?

потому, что если ты не будешь сообщать о ходе работ то вероятность того, что про тему забудут резко возрастает. Улыбаюсь

кстати вот тебе рабочий код на основе на основе данных из msdn Улыбаюсь :
Код:
template<class T, class T2>
void ByteToHexStream(T& strm, T2 b)
{
strm.fill('0');
strm.setf(std::ios_base:: hex, std::ios_base:: basefield);
strm << std::setw(sizeof(T2)*2) << static_cast<unsigned long>(b);
}

int _tmain(int argc, _TCHAR* argv[])
{
// Declare and initialize variables
PMIB_IFTABLE ifTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;

// Allocate memory for our pointers
ifTable = (MIB_IFTABLE*) malloc(sizeof(MIB_IFTABLE));

// Make an initial call to GetIfTable to get the
// necessary size into the dwSize variable
if (GetIfTable(ifTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
free(ifTable);
ifTable = (MIB_IFTABLE *) malloc (dwSize);
}

// Make a second call to GetIfTable to get the
// actual data we want
if ((dwRetVal = GetIfTable(ifTable, &dwSize, 0)) == NO_ERROR)
{
printf("\tNumber of entries: %ld\n", ifTable->dwNumEntries);
for (DWORD  i = 0; i<ifTable->dwNumEntries; ++i)
{
std::stringstream str;

std::cout << "Entry: " << i << "\n";

if (ifTable->table[i].dwPhysAddrLen)
ByteToHexStream(str, ifTable->table[i].bPhysAddr[0]);

for (DWORD  j = 1; j < ifTable->table[i].dwPhysAddrLen; ++j)
{
str << ":";
ByteToHexStream(str, ifTable->table[i].bPhysAddr[j]);
}
str.setf(std::ios_base::dec, std::ios_base::basefield);
str << "|" << ifTable->table[i].dwInOctets/8 << "|" << ifTable->table[i].dwOutOctets/8;
std::cout << str.str() << "\n";
}
}
else
printf("\tGetIfTable failed.\n");


return 0;
}
« Последнее редактирование: 07-12-2007 21:09 от Алексей1153++ » Записан

Странно всё это....
Fg99
Гость
« Ответ #19 : 05-02-2007 16:45 » 

LogRus, спасибо =) Твой пример не пробовал запускать, атнака все-равно пасиба.
Так и не разобрался в чем была причина. Всё заработало о_0. в общем, спс.
Записан
Fg99
Гость
« Ответ #20 : 05-02-2007 16:48 » 

LogRus, 3) почему?
это я по структурам? Почему считаешь, что "зря"?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #21 : 05-02-2007 18:18 » 

Fg99, потому, что велосипед Улыбаюсь это раз
во вторых малоли какие там прагмы есть/нет посреди структуры

в общем без крайней необходимости велосипеды изобретать дело вредное, наверняка кто уже обовсём подумал за нас Улыбаюсь
Записан

Странно всё это....
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #22 : 05-02-2007 18:20 » 

имхо код был немного, не универсален
например, небыло этого
Код:
for (DWORD  j = 1; j < ifTable->table[i].dwPhysAddrLen; ++j)
{
str << ":";
ByteToHexStream(str, ifTable->table[i].bPhysAddr[j]);
}

и возможно структуры у тебя всёже кривые были. выравнивания нет/есть да мало ли. Это же МАГИЯ Улыбаюсь
« Последнее редактирование: 07-12-2007 21:10 от Алексей1153++ » Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines