Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   С++ Builder проблема с кучей (https://forum.antichat.xyz/showthread.php?t=104173)

_nic 01.02.2009 16:18

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

Jes 01.02.2009 18:24

Цитата:

типо в блок памяти размера Х пытаются что то запихать размером Х+1байт
не о нулевом байте в конце строки случайно речь идет? ;)

_nic 01.02.2009 18:55

Цитата:

Сообщение от 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 :(

FoX's 01.02.2009 19:26

когда память выделяешь ее нужно почистить.. там мусор обычно. вот strlen и вылезает за пределы

_nic 01.02.2009 19:39

Цитата:

Сообщение от FoX's
когда память выделяешь ее нужно почистить.. там мусор обычно. вот strlen и вылезает за пределы

strlen ?Да ну?За пределы ?Аж ровно на 1 байт?Серьезно?

_nic 01.02.2009 23:36

Цитата:

Сообщение от ChaaK
А как ты до globbuf достучался? Она у тебя статическая или глобальная?

Конечно же глобальная.Как я писал выше после парсинга данных в переменной место под которую было выделено в куче,попытка освободить это самое место с помощью delete,free кончались Acces Violation Ну так вот если делать так
Код:

new *buf=new char[1024];
memset(buf,NULL,1024);
strcat(buf,"LALALALALA");
delete []buf;//получается тут Acces Violation

А вот если сделать так
Код:

new *buf=new char[1024];
memset(buf,NULL,1024);
strcat(buf,"LALALALALA");
buf+=1;
delete []buf;//ВСЕ ОК!

Вот теперь сижу и думаю в чем тут прикол :confused:

_nic 02.02.2009 01:40

Цитата:

Сообщение от ChaaK
Используй для этого sizeof

Я непонимаю :( Где использовать sizeof ?

__mad 02.02.2009 01:51

Что то вы ***ню пишете господин, только что проверил
Код:

  char *buf;
  buf = new char[1024];
  memset(buf,NULL,1024);
  strcat(buf,"LALALALALA");
  delete []buf;//получается тут Acces Violation
  return 0;

и не каких аксес валейшенов, проблема может быть только изза неправильного обращения с выделенной памятью т.е. записал за границу выделенного массива памяти.
как раз таки о чём и говорил FoX's.

_nic 02.02.2009 10:40

Цитата:

Сообщение от __mad
Что то вы ***ню пишете господин, только что проверил
Код:

  char *buf;
  buf = new char[1024];
  memset(buf,NULL,1024);
  strcat(buf,"LALALALALA");
  delete []buf;//получается тут Acces Violation
  return 0;

и не каких аксес валейшенов, проблема может быть только изза неправильного обращения с выделенной памятью т.е. записал за границу выделенного массива памяти.
как раз таки о чём и говорил FoX's.

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

awdrg 02.02.2009 16:02

Про то что массив начинается с 0 а не с 1 автор знает? Крайнее значение (учитывая нулевой байт) = buf[1022]
buf[1023] = '\0'
Скорее всего ошибка присвоения за границы массива по ходу дальнейшего кода. У меня этот кусок компилится прекрасно


Время: 10:58