Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятный глюк с оператором new

15K
25 мая 2008 года
basil-77
40 / / 17.03.2007
Был код

 
Код:
char* str;
int len;

len = 3;
str = new char[len]


Работало все нормально... Недавно (непонятно после чего, код не менял, вообще этот проект не трогал), работать перестал, на строке с new вывыливает AV... При этом если переписать код в виде:

 
Код:
char* str;
int len;

len = 3;
str = new char[3]


то все ок...
В чем может быть трабла? Почти день убил, понять не могу...
Даже если предположить нехватку памяти при динамическом выделении (что очень маловероятно), то все остается неясным почему работает
 
Код:
str = new char[255]

и не работаетa
 
Код:
str = new char[len] // len=3
361
25 мая 2008 года
Odissey_
661 / / 19.09.2006
Эм... а len не может быть где нибудь переопределена тобой же ? =)
15K
25 мая 2008 года
basil-77
40 / / 17.03.2007
Цитата: Odissey_
Эм... а len не может быть где нибудь переопределена тобой же ? =)



Неа, len вычисляется строкой выше (всегда)... Да и в режиме отладки видно, что len получает верное значение...

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

6.6K
25 мая 2008 года
Ordos
105 / / 02.11.2007
А что происходит в строке, где ты создаёшь массив? Исключение, или не компилится просто? Напиши ошибку, которая вылетает.
15K
25 мая 2008 года
basil-77
40 / / 17.03.2007
Цитата: Ordos
А что происходит в строке, где ты создаёшь массив? Исключение, или не компилится просто? Напиши ошибку, которая вылетает.



Компилится все нормально. В рантайме исключение вылетает (acceess violation art 0x2c313d78 ...)

5
25 мая 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: basil-77

 
Код:
char* str;
int len;

len = 3;
str = new char[len]
Работало все нормально... Недавно (непонятно после чего, код не менял, вообще этот проект не трогал), работать перестал, на строке с new вывыливает AV...


А почему нету ; и что расположено строкой ниже?

15K
25 мая 2008 года
basil-77
40 / / 17.03.2007
; естественно есть... а то, что строкой ниже... а не все ли равно, дальше выполнение все равно не идет...
но если интересно, то вот полностью:
Код:
char* polynom :: list() const
{
  char* tmp;

  tmp = new char[255];
  strset(tmp,0);
  for (int i=0; i<countm; i++)
    tmp = strcat(tmp,m.list());

  int counts = strlen(tmp);      // определяется правильно, значение = 3

  char* sres;
  sres = new char[counts];     // тут вываливается AV
  //sres = new char[255];  // а вот так не вываливается, все работает, хотя counts даже больше 3 значение не принимает    
 
  int pos=0;
  bool flag=false;

  for (int i=0; i<counts; i++)
    {
     flag = false;
     for (int j=0; j<pos; j++)
        if (tmp==sres[j]) flag = true;
     if (!flag)
      {
       sres[pos] = tmp;
       pos++;
      }
    }

  char* res;
  res = new char[pos];
  //res = new char[255];
  strset(res,0);
  strncpy(res, sres, pos);

  delete[] tmp;
  delete[] sres;

  return res;
}


и что в общем-то странное... участков кода типа char* res; res = new char[len] во всем проекте много. И все работало. А теперь на каждом вываливатся AV
зы. сам код я писал месяц назад на том же билдере... Все отладил, все было ок... А тут пришло время им воспользоваться и вот началось... ничего не понимаю
5
25 мая 2008 года
hardcase
4.5K / / 09.08.2005
Ошибка наверняка наведенная.
Виноват в этом предыдущий цикл: ищи ошибки в работе с функцией strcat (очень "вредная" она).
15K
25 мая 2008 года
basil-77
40 / / 17.03.2007
hardcase, не думаю, что виновата strcat... Во-первых, в других местах ее нет, а во-вторых - ну работало же!
И самое главное - установил Turbo C++ Explorer (который бесплатный), открыл проект в нем - все скомпилилось и выполнилось на ура. Как и было раньше...

Видимо, все таки с билдером глюк... Вот такие дела.
5
25 мая 2008 года
hardcase
4.5K / / 09.08.2005
В любом случае общий совет - никогда не пользуйтесь C-style функциями и "строками" char*. В идеале строка должна быть вообще немодифицируемым объектом.
15K
25 мая 2008 года
basil-77
40 / / 17.03.2007
hardcase, учту :)
255
30 мая 2008 года
Dart Bobr
1.4K / / 09.04.2004
Выключи оптимизацию кода. Иногда помогает.
27K
30 мая 2008 года
David_K800i
36 / / 27.05.2008
strlen(tmp); // определяется правильно, значение = 3
а с чего ты взял что тут все верно??
если я не ошибаюсь то ей нужен \n ??
мож поэтому и валится все
просто она одна учавствует во всех функциях
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог