So, you've got a code in C that needs to allocate X objects of size Y. So, you start with malloc(X*Y). Then you discover X*Y may produce overflow, so you make function alloc(X, Y) that checks for overflows.
And then of course everybody starts using it as alloc(1, X*Y). Because it's the same thing, right?
And then of course everybody starts using it as alloc(1, X*Y). Because it's the same thing, right?
no subject
На Java точно такую же ошибку учинить нельзя, поскольку там при переполнении буфера будет IndexOutOfBounds. Что тоже не фонтан, но хотя бы не разрушает все окрестности. Насчёт того, как Java ведёт себя с аллокациями, не знаю, но надеюсь, что на integer overflow они проверяют при расчётах размера обьекта, а то было бы совсем грустно.
no subject
"На Java при переполнении буфера будет IndexOutOfBounds" - это я знаю. Я о возможности арифметического переполнения при целых вычислениях (если результат не используется потом для индекса).
можно и STL container сделать который будет проверять IndexOutOfBounds.
no subject
Молодчинка! Как жаль, что весь мир не упакован в аккуратные STL-контейнеры!
но это будут ссылки на отдельно аллокированные буфера.
А, то есть если вам надо сделать 20 миллионов обьектов, то вы собираетесь делать 20 миллионов аллокаций? O tempora, o mores!
no subject
> то есть если вам надо сделать 20 миллионов обьектов, то вы собираетесь делать 20 миллионов аллокаций?
1. Не я, а STL автоматически.
2. Не 20 миллионов аллокаций, а намного меньше больших кусков (в которых STL allocator автоматически разместит эти 20 миллионов данных меньших размеров).
Кстати STL и автоматически освободит всё когда станет ненужным. Забыл когда free() или delete вызывал - обычно просто STL container автоматические переменные и всё само освобождается когда выходит из scope, или поле в объекте тогда освобождается когда объект деструктируется.