char* str;
int len;
len = 3;
str = new char[len]
Непонятный глюк с оператором new
Код:
Работало все нормально... Недавно (непонятно после чего, код не менял, вообще этот проект не трогал), работать перестал, на строке с new вывыливает AV... При этом если переписать код в виде:
Код:
char* str;
int len;
len = 3;
str = new char[3]
int len;
len = 3;
str = new char[3]
то все ок...
В чем может быть трабла? Почти день убил, понять не могу...
Даже если предположить нехватку памяти при динамическом выделении (что очень маловероятно), то все остается неясным почему работает
Код:
str = new char[255]
и не работаетa
Код:
str = new char[len] // len=3
Эм... а len не может быть где нибудь переопределена тобой же ? =)
Цитата: Odissey_
Эм... а len не может быть где нибудь переопределена тобой же ? =)
Неа, len вычисляется строкой выше (всегда)... Да и в режиме отладки видно, что len получает верное значение...
В чем дело??? Вроде код-то простецкий, а вот такое выкинул... мож у меня билдер глюкнул вконец? хотя пробовал переустановить - не помогло... Уже всю голову сломал, завтра код работающий нужен...
А что происходит в строке, где ты создаёшь массив? Исключение, или не компилится просто? Напиши ошибку, которая вылетает.
Цитата: Ordos
А что происходит в строке, где ты создаёшь массив? Исключение, или не компилится просто? Напиши ошибку, которая вылетает.
Компилится все нормально. В рантайме исключение вылетает (acceess violation art 0x2c313d78 ...)
Цитата: basil-77
Код:
char* str;
int len;
len = 3;
str = new char[len]
int len;
len = 3;
str = new char[len]
А почему нету ; и что расположено строкой ниже?
но если интересно, то вот полностью:
Код:
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* 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
зы. сам код я писал месяц назад на том же билдере... Все отладил, все было ок... А тут пришло время им воспользоваться и вот началось... ничего не понимаю
Виноват в этом предыдущий цикл: ищи ошибки в работе с функцией strcat (очень "вредная" она).
И самое главное - установил Turbo C++ Explorer (который бесплатный), открыл проект в нем - все скомпилилось и выполнилось на ура. Как и было раньше...
Видимо, все таки с билдером глюк... Вот такие дела.
В любом случае общий совет - никогда не пользуйтесь C-style функциями и "строками" char*. В идеале строка должна быть вообще немодифицируемым объектом.
hardcase, учту :)
Выключи оптимизацию кода. Иногда помогает.
а с чего ты взял что тут все верно??
если я не ошибаюсь то ей нужен \n ??
мож поэтому и валится все
просто она одна учавствует во всех функциях