Если выделить память в куче любым способом хоть то malloc/free,new/delete,HeapAlloc/HeapFree И что то в ней парсить текстовое с помощью memset,strcpy,strcat и т.д. То кодегвард матерится на каждую такую операцию AccessOverrun типо в блок памяти размера Х пытаются что то запихать размером Х+1байт ,и это независит от количества памяти выделенной под переменную ,все равно будет +1байт Вроде бы так ничего ,программа невылетает.НО.Если парсить очень много данных.То при вызове free,delete вылазит AccessViolation в это случае кодегвард говорит что это "Bad Array" Тоесть место распожение данных в куче куда сдвигается и освободить память становится проблематично Как можно боротся с такой фигней?Ибо если перед завершением ф-ции неосвобождать память то она очень заметно течет. ЗЫ:BDS 2006
Code: 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
Конечно же глобальная.Как я писал выше после парсинга данных в переменной место под которую было выделено в куче,попытка освободить это самое место с помощью delete,free кончались Acces Violation Ну так вот если делать так Code: new *buf=new char[1024]; memset(buf,NULL,1024); strcat(buf,"LALALALALA"); delete []buf;//получается тут Acces Violation А вот если сделать так Code: new *buf=new char[1024]; memset(buf,NULL,1024); strcat(buf,"LALALALALA"); buf+=1; delete []buf;//ВСЕ ОК! Вот теперь сижу и думаю в чем тут прикол
Что то вы ***ню пишете господин, только что проверил Code: char *buf; buf = new char[1024]; memset(buf,NULL,1024); strcat(buf,"LALALALALA"); delete []buf;//получается тут Acces Violation return 0; и не каких аксес валейшенов, проблема может быть только изза неправильного обращения с выделенной памятью т.е. записал за границу выделенного массива памяти. как раз таки о чём и говорил FoX's.
Так не нада тут ссылатся на предшествующих авторов.Если хотите написать что то умное,тогда уж покажите где у меня там выходит за пределы выделенного массива.
Про то что массив начинается с 0 а не с 1 автор знает? Крайнее значение (учитывая нулевой байт) = buf[1022] buf[1023] = '\0' Скорее всего ошибка присвоения за границы массива по ходу дальнейшего кода. У меня этот кусок компилится прекрасно
Конкретно в таком коде ошибок нету: Code: #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; } Аффтар, ты промахиваешься где-то в другом месте...
как я те покажу? если ты выложил три строчки когда в котором нету ошибок, выкладывай весь код в котором у тебя возникает ошибка, тогда и попробую показать.
Да уж.....6й с++ билдер класная весчь была.А теперь оно непонятно в что выродилось Буду потихоньку на Visual C++ Studio переходить
Code: new *buf=new char[1024]; memset(buf,NULL,1024); strcat(buf,"LALALALALA"); buf+=1; delete []buf;//ВСЕ ОК! таким образом ты указатель на 1 сдвигаеш и не более при этом теряеш первый символ. Вообщем бред полный получается. Выложи код проблема в другом месте это явно.