С++ Builder проблема с кучей

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 1 Feb 2009.

  1. _nic

    _nic Elder - Старейшина

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

    Jes Elder - Старейшина

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    не о нулевом байте в конце строки случайно речь идет? ;)
     
    1 person likes this.
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    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 :(
     
  4. FoX's

    FoX's Дохлый

    Joined:
    26 Dec 2004
    Messages:
    169
    Likes Received:
    29
    Reputations:
    0
    когда память выделяешь ее нужно почистить.. там мусор обычно. вот strlen и вылезает за пределы
     
  5. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    strlen ?Да ну?За пределы ?Аж ровно на 1 байт?Серьезно?
     
  6. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Конечно же глобальная.Как я писал выше после парсинга данных в переменной место под которую было выделено в куче,попытка освободить это самое место с помощью 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;//ВСЕ ОК!
    
    Вот теперь сижу и думаю в чем тут прикол :confused:
     
  7. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я непонимаю :( Где использовать sizeof ?
     
  8. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    Что то вы ***ню пишете господин, только что проверил
    Code:
      char *buf;
      buf = new char[1024];
      memset(buf,NULL,1024);
      strcat(buf,"LALALALALA");
      delete []buf;//получается тут Acces Violation
      return 0;
    и не каких аксес валейшенов, проблема может быть только изза неправильного обращения с выделенной памятью т.е. записал за границу выделенного массива памяти.
    как раз таки о чём и говорил FoX's.
     
  9. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Так не нада тут ссылатся на предшествующих авторов.Если хотите написать что то умное,тогда уж покажите где у меня там выходит за пределы выделенного массива.
     
  10. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    Про то что массив начинается с 0 а не с 1 автор знает? Крайнее значение (учитывая нулевой байт) = buf[1022]
    buf[1023] = '\0'
    Скорее всего ошибка присвоения за границы массива по ходу дальнейшего кода. У меня этот кусок компилится прекрасно
     
    #10 awdrg, 2 Feb 2009
    Last edited: 2 Feb 2009
  11. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Конкретно в таком коде ошибок нету:

    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;
    }
    Аффтар, ты промахиваешься где-то в другом месте...
     
  12. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    как я те покажу? если ты выложил три строчки когда в котором нету ошибок, выкладывай весь код в котором у тебя возникает ошибка, тогда и попробую показать.
     
  13. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Да уж.....6й с++ билдер класная весчь была.А теперь оно непонятно в что выродилось :( Буду потихоньку на Visual C++ Studio переходить
     
  14. St0nX

    St0nX Elder - Старейшина

    Joined:
    19 May 2007
    Messages:
    257
    Likes Received:
    46
    Reputations:
    0
    Code:
    new *buf=new char[1024];
    memset(buf,NULL,1024);
    strcat(buf,"LALALALALA");
    buf+=1;
    delete []buf;//ВСЕ ОК!
    таким образом ты указатель на 1 сдвигаеш и не более при этом теряеш первый символ. Вообщем бред полный получается. Выложи код проблема в другом месте это явно.