Еще вопрос - std::malloc и глобальный operator new это одно и то же?
Т.е. если я сделаю так, это будет законно?
void* mem = std::malloc(100); ::operator delete ( mem);
kkolyan
> впрочем, delete вроде безопасен даже на невалидных поинтерах, так что
насколько я помню, delete конкретно для nullptr безопасен, но вовсе не для какого попало указателя.
Suslik
The behavior of the standard library implementation of this function is undefined unless ptr is a null pointer or is a pointer previously obtained from the standard library implementation of operator new(size_t) or operator new(size_t, std::nothrow_t).
Suslik
> насколько я помню, delete конкретно для nullptr безопасен, но вовсе не для какого попало указателя.
ага. фигню сказанул.
nes
> Т.е. если я сделаю так, это будет законно?
это 100% UB.
В твоём случае должно быть:
free(mem);
или
new/delete, new[] /delete[]
.
nes
> Еще вопрос - std::malloc и глобальный operator new это одно и то же?
Вообще не одно и то же, но второе нередко под капотом вызывает первое, но это детали реализации.
> Т.е. если я сделаю так, это будет законно?
Прокатить даже может, но нет, незаконно.
У меня ещё вон что из мной написанного нашлось.
Алексей Патрашов
А в чём вопрос?
Имбирная Ведьмочка
> А в чём вопрос?
В том, как оно умудряется работать при том, что я не помню, как это написал.
Алексей Патрашов
> В том, как оно умудряется работать при том, что я не помню, как это написал.
А как ты определил что оно работает?
clifganger
> А как ты определил что оно работает?
Скомпилировал и запустил: оно рисует случайно расположенные точки не ближе заданного расстояния между ними.
nes
> Т.е. если я сделаю так, это будет законно?
> void* mem = std::malloc(100);
> ::operator delete (mem);
В общем случае нет, конечно же. По твоему new/delete это какая-то шутка?
Zefick
Я предполагал что это аналоги.
Dmitry_Milk
> Может быть можно придумать какое-нибудь еще красивое решение?
Как вариант можно подумать над обёрткой над std::make_unique, которая будет инкрементировать счётчик при удачном создании и вешать кастомный делитер на уникальный указатель, который будет декрементировать счётчик.
Went
> кастомный делитер на уникальный указатель
Это все равно под капотом аналог некоторого виртуального метода, то есть все равно сохранение дополнительной инфы в объекте.
Мне тут пришла мысль - все-таки я наверное откажусь от RAII для этого счетчика, а просто у рекурсивных виртуальных методов парсинга сделаю возвращаемое значение не void а int, обозначающее количество всех дочерних элементов, посчитав его как сумму возвратов от всех рекурсивных вызовов парсеров дочерних элементов - так это значение станет просто локальным, гарантированно начиная с нуля при открытии очередной первой скобки.