Поскольку память по-прежнему отображается в ваш процесс, но не выделяется. В программе C есть два уровня управления памятью: во-первых, ядро дает вам страницы, на которые вы можете писать. Если для процесса требуется больше памяти, которую он отобразил, он должен запросить больше из ядра (sbrk). Это происходит в больших кусках, поэтому malloc разрезает его на куски для вас, запрашивая больше страниц по мере необходимости, но используя, где возможно, память, уже выделенную для программы. free не может вернуть страницу до тех пор, пока все используемые ею распределения не будут освобождены.
Таким образом, нарушения доступа к памяти, которые ядро дает вам (SIGSEGV), довольно грубые и не могут собрать большую часть памяти ошибки, только вещи, которые являются фатальными с точки зрения ядра. Вы можете удалять данные отслеживания malloc, читать их до конца большинства распределений и после многих бесплатных и т. Д.
Однако никогда не выполняйте ошибки памяти. Запустите приложение с valgrind, в котором используется очень строгая виртуальная машина, чтобы проверить все ошибки и раздавить их немедленно.
Постарайтесь поместить свой неизменный заимствование в блок {...}. Это завершает заимствование после блока.
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn some_test() {
let mut graph = mk_graph();
graph.add_node("source".to_string());
graph.add_node("destination".to_string());
{
let source = graph.get_node_by_value("source").unwrap();
let dest = graph.get_node_by_value("destination").unwrap();
}
graph.add_node("destination".to_string());
}
}
(&mut q).push('D')
и(&q).pop
, который заимствуетq
как изменяемую ссылку, а затем неизменяемую ссылку. – Shulhi Sapli 4 December 2017 в 01:38