- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
int** delete_row(int** arr, int &row_count, int n)
{
delete arr[n-1];
for (int i = n-1; i < row_count-1; i++)
{
arr[i] = arr[i+1];
}
arr[row_count-1] = NULL;
delete arr[row_count-1];
row_count--;
return arr;
}
Факт. Пока продерешься через все эти операторы * и -> от смартпоинтеров...
нет
> STL затрудняет отладку
потому что с STL ты сразу корректные программы писать начинаешь, и отлаживать становится нечего?
Закопайте отладчик, пишите юнит-тесты. Я плюсовый отладчик запускаю раз в полгода чтобы в coredump поковыряться.
Я слишко часто об этом забываю, поэтому после каждого зелёного теста приходится стэшить изменения в коде, убеждаться, что тест падает, а потом накатывать изменения обратно.
Я уже лет 5 пишу программы, которые работают на другом конце света, и которые крэшатся, если минуту на хартбиты не отвечают. Какой мне толк от отладчика?
Отладчик я только в Emacs используют, чтобы понять, какой мудак мне в глобальную переменную срёт (я застукал тебя, сраный убогий haskell-mode).
Дебаггер не нужен, трассировщик изредка бывает полезен, если знаешь что искать, но практика показывает, что быстрее разобраться в коде, чем в портянке трейсов.
Ты кстати как, от Erlang-а не плюёшься?
Уже не особо. Это практичный нишевой язык с ограниченным, но продуманным набором ортогональных фич. Это не kitchen sink модных баззвордов (в отличие от С++) и не kitchen sink диссертаций в отличие от Haskell.
+там один из лучших рантаймов для работы с IO и сетью, что я встречал. Недавно сам был нимало удивлён как быстро схаченная на коленке P2P приблуда нам раскатывает по кластеру терабайты данных. Буквально на порядок быстрее transmission и обмазанного по уши boost::asio libtorrent.
у нас только на вступительном.
пишите — императив, пишете — множ. число настоящего времени.
Хоть на что-то ты годишься — грамматические ошибки находишь.
Да, я помню, весело ьогда было...
http://cdn.mcstatic.com/contents/videos_screenshots/1162000/1162955/preview.jpg
У него есть некая внутренняя веб-мордочка с минимумом JS.
tsar
Обычные юнит-тесты пишешь. Есть у тебя, к примеру, класс "Service", который запускает отдельный поток, и у которого есть Stop() и Start().
TSAN будет проверять, что ты там рейс-кондишенов не наплодил.
Специальных тестов для него мы не пишем.
delete[] arr[i];
а не
delete arr[i];
Вместо цикла можно впендюрить memmove, ну и, конечно, самый разумный способ реализовать желаемое — использовать вектор векторов
Теперь я не понимаю почему вообще работает мой код. Я котел освободить память на которую указывает a[k-1], а потом сделать так, чтобы a[k-1] указывал на ту же строку, что и a[k] .
Бывший питонист или жсник что ли?
Ну указатели ты вроде правильно перезаписал, просто память криво освободил, и аллокатору теперь может крышу снести в самом неожиданном месте.
Да просто утечка, удаление null'а даже не UB.
при чём тут удаление null'а? он результат new[] передаёт в delete, а не в delete[].
From the standard (5.3.5/2) :
In the first alternative (delete object), the value of the operand of delete shall be a pointer to a non-array object or a pointer to a sub-object (1.8) representing a base class of such an object (clause 10). If not, the behavior is undefined.
In the second alternative (delete array), the value of the operand of delete shall be the pointer value which resulted from a previous array new-expression. If not, the behavior is undefined.
-- https://stackoverflow.com/questions/4255598/delete-vs-delete
Какое же всё таки унылое гуано, этот Ваш c++. То ли дело php Pascal.
Получается, что я удалил указатель, а потом заставил ссылаться на другую область памяти. Как такое возможно? Я же его уже удалил(delete arr[n-1]).
А delete[] каждому элементу массива позовёт деструктор.
Причем Clang даже ворнинг выписывает сразу:
еще есть boost::matrix
Чтобы поняли, что программисты не просто так зарплату получают. На каком-нибудь "PHP" это сделать не выйдет.
Вай нот? Хотя можно и тупо скопировать каталог.
> delete arr[row_count-1];
Интересно, догадается ли компилятор оптимизировать? (выкинуть delete)