ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
С++ Builder проблема с кучей |

01.02.2009, 16:18
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
С++ Builder проблема с кучей
Если выделить память в куче любым способом хоть то malloc/free,new/delete,HeapAlloc/HeapFree И что то в ней парсить текстовое с помощью memset,strcpy,strcat и т.д. То кодегвард матерится на каждую такую операцию AccessOverrun типо в блок памяти размера Х пытаются что то запихать размером Х+1байт ,и это независит от количества памяти выделенной под переменную ,все равно будет +1байт  Вроде бы так ничего ,программа невылетает.НО.Если парсить очень много данных.То при вызове free,delete вылазит AccessViolation  в это случае кодегвард говорит что это "Bad Array" Тоесть место распожение данных в куче куда сдвигается и освободить память становится проблематично  Как можно боротся с такой фигней?Ибо если перед завершением ф-ции неосвобождать память то она очень заметно течет.
ЗЫ:BDS 2006
|
|
|

01.02.2009, 18:24
|
|
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
Провел на форуме: 3371897
Репутация:
1462
|
|
типо в блок памяти размера Х пытаются что то запихать размером Х+1байт
не о нулевом байте в конце строки случайно речь идет? 
|
|
|

01.02.2009, 18:55
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
Сообщение от Jes
не о нулевом байте в конце строки случайно речь идет? 
Код:
char *globbuf=new char[1024];
.................................................
void myfunc()
{
char *buf=new char[strlen(globbuf)+1];
.............................................................
memset(buf,NULL,strlen(buf));//CodeGuard=>"Access Overrun....."
}
Так что я непонимаю причем здесь нулевой байт.По мои наблюдения любая операция с изменениями данных в выделенной перемной в куче смещяет этот выделенный блок памяти куда то на 1 байт.В итоге при попытке его освободить или активном его юзе в парсинге текста получается Access Violation 
|
|
|

01.02.2009, 19:26
|
|
Участник форума
Регистрация: 26.12.2004
Сообщений: 188
Провел на форуме: 1495357
Репутация:
107
|
|
когда память выделяешь ее нужно почистить.. там мусор обычно. вот strlen и вылезает за пределы
|
|
|

01.02.2009, 19:39
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
Сообщение от FoX's
когда память выделяешь ее нужно почистить.. там мусор обычно. вот strlen и вылезает за пределы
strlen ?Да ну?За пределы ?Аж ровно на 1 байт?Серьезно?
|
|
|

02.02.2009, 01:51
|
|
Участник форума
Регистрация: 04.11.2007
Сообщений: 103
Провел на форуме: 548128
Репутация:
104
|
|
Что то вы ***ню пишете господин, только что проверил
Код:
char *buf;
buf = new char[1024];
memset(buf,NULL,1024);
strcat(buf,"LALALALALA");
delete []buf;//получается тут Acces Violation
return 0;
и не каких аксес валейшенов, проблема может быть только изза неправильного обращения с выделенной памятью т.е. записал за границу выделенного массива памяти.
как раз таки о чём и говорил FoX's.
|
|
|

02.02.2009, 10:40
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме: 2982851
Репутация:
107
|
|
Сообщение от __mad
Что то вы ***ню пишете господин, только что проверил
Код:
char *buf;
buf = new char[1024];
memset(buf,NULL,1024);
strcat(buf,"LALALALALA");
delete []buf;//получается тут Acces Violation
return 0;
и не каких аксес валейшенов, проблема может быть только изза неправильного обращения с выделенной памятью т.е. записал за границу выделенного массива памяти.
как раз таки о чём и говорил FoX's.
Так не нада тут ссылатся на предшествующих авторов.Если хотите написать что то умное,тогда уж покажите где у меня там выходит за пределы выделенного массива.
|
|
|

02.02.2009, 16:02
|
|
Участник форума
Регистрация: 30.01.2009
Сообщений: 196
Провел на форуме: 505362
Репутация:
66
|
|
Про то что массив начинается с 0 а не с 1 автор знает? Крайнее значение (учитывая нулевой байт) = buf[1022]
buf[1023] = '\0'
Скорее всего ошибка присвоения за границы массива по ходу дальнейшего кода. У меня этот кусок компилится прекрасно
Последний раз редактировалось awdrg; 02.02.2009 в 16:40..
|
|
|

02.02.2009, 16:31
|
|
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме: 2238549
Репутация:
1318
|
|
Конкретно в таком коде ошибок нету:
Код:
#include <string.h>
#include <memory.h>
int main () {
char *buf;
buf = new char[1024];
memset(buf, NULL, 1024);
strcat(buf, "LALALALALA");
delete buf;
return 0;
}
Аффтар, ты промахиваешься где-то в другом месте...
|
|
|

02.02.2009, 17:12
|
|
Участник форума
Регистрация: 04.11.2007
Сообщений: 103
Провел на форуме: 548128
Репутация:
104
|
|
Если хотите написать что то умное,тогда уж покажите где у меня там выходит за пределы выделенного массива.
как я те покажу? если ты выложил три строчки когда в котором нету ошибок, выкладывай весь код в котором у тебя возникает ошибка, тогда и попробую показать.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|