Статьи / Типичные ошибки программирования

Типичные ошибки программирования


Отправить ссылку:

Ошибка № 4. «Смотри что используешь»



Иногда бывает так, что теряешь веру в программирование. Происходят мистические вещи. Приравниваешь переменную, потом смотришь, а она уже имеет другое значение. Бывает много случаев, когда такое происходит. Самое лучшее по шагам просмотреть, не приравнивается ли другая переменная. Например:

int I = 0;
I = 10;
if(I > 0)
{
int I;
cout << I << endl;
}

В результате выведется на экран, число либо 0, либо с неизвестным значением, т.к. переменная не инициализирована. Надеюсь понятно почему=)

Ошибка № 5. «Разделяй и властвуй»



Бывают ошибка, которые очень трудно отладить и понять, что эта ошибка и почему это происходит очень трудно. Например, недавно произошла такая ошибка:

Class A
{
A();
~A();
void DoIt(int a);
};

Вот компилятор gcc ругался на void DoIt(int a);, и что вы думаете в VC всё компилиться. Так что вы думаете, ошибка была в void, то есть в gcc необходимо было подключить файл, что бы void можно было использовать.
А проблема, которая перед нами стоит в следующим: если происходит такая ошибка, что делать???
Я советую применять так называемый метод: двоичного поиска. Во время компиляции или во время исполнения программы возникла ошибка, вы исключаете половина операторов, которые могут привести к ошибки. Если ошибки нет, то проблема в то, что вы исключили, если ошибка повторяется, то она в тех строках, которые вы не исключили. Такой метод эффективен для поиска сложных ошибок.

Ошибка № 6. «Когда творятся чудеса»



Симптомы: Если вы работаете, с указателями на функцию. То есть загружаете функцию из dll-ки и потом используете её как указатель на неё. Если у вас происходит такая проблема, что через несколько строк кода, после вызова такой функции в программе творятся «чудеса». Например, указатели сами по себе начинаются, меняется, или меняются значения переменных. Причина этому коррупция стека, а привело к этому не правильно прописанный прототип функции. Так что вам надо только проверить раз 10 прототипы функций, а потом если это не поможет исправлять ошибку в другом месте.

Ошибка № 7. «Что-то с памятью моей»



Если возникает ошибка, при манипуляции памятью, например при вызове new или delete. Но вроде бы функции корректно вызываются, и удаляется не нулевой указатель. И вы не знаете что такое, а ошибка пишется что-то вроде «Heap повреждён». Бывает трудно найти, где и в чём проблема. Вообще это происходит по разным причинам, но результат один вы не корректно работает с память.
Есть такой пример:

char* a = new char[10];
a++;
delete[] a;

И что вы думаете, кажется всё правильно, но вот последний оператор вызовет ошибку. Почему? Получается так: вам выделили память с начальным адресов который хранится в «a», а потом вы сдвигаете указатель на один байт, и пытаетесь, освободит память уже с другим адресом, информации о котором нет. Вот и происходит ошибка. Ещё такая ошибка может возникать в много поточных приложениях, или при работе с dll файлами, когда динамическая переменная создаётся в одном месте, а удаляется в другом. Для подробной информации можете почитать, как организована динамическая память.


При полном или частичном копировании необходимо указывать ссылку на данную статью.


Олег (Дата )

Все вопросы и предложения высылайте на адрес soft_support@list.ru. Необходимо в заголовке указать название статьи.

Оставь свой отзыв


Ответьте на вопрос (ответ маленькими буквами)* :
трети месяц года