Pull to refresh

Comments 22

Интересно, PVS-Studio справится с такой задачей, что скажет Andrey2008?

К сожалению, пока нет. Выписал для будущих доработок dataflow.

А круто в online покрутить PVS-Studio, не знал про такую возможность. Потыкал, memory leak ловится исправно. Интересно, а на сайте у вас почему нет на видном месте такой полезной возможности попробовать анализатор? Или я не вижу видного места?

Интересно, как в других языках с этой проблемой life time-а боролись? В С\С++ никак, понятно.

Сборщик мусора просто не будет собирать память, на которую есть указатели, так что нет проблемы "висячих ссылок".

Это можно также назвать не борьбой, а капитуляцией. Типа, делайте, что хотите, потом за вами все уберут. Это, правда, будет стоить отдельных денег и даже могут потребоваться технологические перерывы (GC & CPU spikes).

К этому можно по-разному относится. Да, сборка мусора имеет свою цену, но этот подход имеет и свои достоинства: проще для разработчиков, легче делать структуры вроде графов.


Я сам пишу на расте, если что, но не уверен, что согласен с утверждением про "капитуляцию". Много где такой подход вполне работает.

Концепция владения дает и определенное преимущество разработчику: с ней становятся заметнее границы использования данных.

проблемы начинаются тогда, когда вы пытаетесь реализовать что-то по типу ConcurentHashMap с java. В языках без gc вам так или иначе придется написать свой мини-gc или использовать блокирующие алгоритмы

потому что при реализации delete/remove в lock-free структурах данных вы не можете просто вызвать деструктор, а использование Arc (shared_ptr) для каждой ноды это слишком дорогое удовольствие и лучше уж использовать тогда mutex. ну как вариант - использование hazard pointers или Epoch-Based Reclamation (который и можно считать тем самым mini-gc)

проблемы начинаются тогда, когда вы пытаетесь реализовать что-то по типу ConcurentHashMap с java. В языках без gc вам так или иначе придется написать свой мини-gc или использовать блокирующие алгоритмы.

Сборка мусора. Программа останавливается, сборщик переодически проходит по всем ссылкам помечая объекты до которых может дойти «живыми», удаляет мёртвые. Может быть медленно для программ с большим количеством объектов. Непостоянная скорость работы и потребление памяти. Трудно запланировть действия необходимые для выполнения перед освобождением объектов.

Подсчёт ссылок. Объекты хранят счётчик количества других объектов которые на него ссылаются, а если счёт опускается до нуля, то удаляется. Небольшой оверхед а рантайме. Ссылки объекта на самого себя, циклические ссылки, либо приводят к утечкам памяти, либо запрещены. Может дополнять сборку мусора, тогда скорость в общем выше, а циклы уберет сборщик.

Не освобождать память. Подходит только для короткоживущих программ.

Это те, что я знаю, может быть есть что-то ещё. Ссылка по теме:

https://m.habr.com/ru/post/489360/

Статическую переменную типа String, по-видимому, сделать нельзя.

Почему?


static S: String = String::new();

Насколько я знаю, сейчас нет. Ну если не рассматривать варианты вроде заворачивания строки в RefCell или мьютекс. Но вообще, вроде, хотят разрешить константным функциям выделять память и тогда это ограничение может быть снято.

Что-то меня уже пугает этот язык: похоже они решили проблему времени жизни указателей, с которой в плюсах большинство справиться не могут. Поэтому плюсы - это язык для 'избранных'. Конкуренция со стороны молодых всегда была слабой, а ниша велика. Но, похоже, скоро Rust захватит эту нишу, и любой дебил сможет на нем кодить. К счастью пока остаётся embedded, где без мозга работать нельзя:).

Ну как решили - написать невалидный код по-прежнему можно. Он просто компилироваться не будет. Т.е. сложность перенесли со времени исполнения (где что-то иногда ломается из-за double free или use after free), на время компиляции. Можно написать такую программу, что её мелкими изменениями не получится поправить (например, наивно написанный двусвязанный список).

Но, похоже, скоро Rust захватит эту нишу, и любой дебил сможет на нем кодить.

Эх, к сожалению, раст не настолько прост. (:

К счастью пока остаётся embedded, где без мозга работать нельзя:).

Если это правда, то почему среди эмбеддеров так много безмозглых косных и неумных людей?

Т.е. если у первого аргумента нет 'a - Rust не компилирует, если у второго нет, то тоже не компилирует, а догадаться, как правильно не может??

Sign up to leave a comment.

Articles