Связывает ссылку на свойство struct с переменной внутри функции, возвращающей изменяемую ссылку [duplicate]

Поскольку память по-прежнему отображается в ваш процесс, но не выделяется. В программе C есть два уровня управления памятью: во-первых, ядро ​​дает вам страницы, на которые вы можете писать. Если для процесса требуется больше памяти, которую он отобразил, он должен запросить больше из ядра (sbrk). Это происходит в больших кусках, поэтому malloc разрезает его на куски для вас, запрашивая больше страниц по мере необходимости, но используя, где возможно, память, уже выделенную для программы. free не может вернуть страницу до тех пор, пока все используемые ею распределения не будут освобождены.

Таким образом, нарушения доступа к памяти, которые ядро ​​дает вам (SIGSEGV), довольно грубые и не могут собрать большую часть памяти ошибки, только вещи, которые являются фатальными с точки зрения ядра. Вы можете удалять данные отслеживания malloc, читать их до конца большинства распределений и после многих бесплатных и т. Д.

Однако никогда не выполняйте ошибки памяти. Запустите приложение с valgrind, в котором используется очень строгая виртуальная машина, чтобы проверить все ошибки и раздавить их немедленно.

4
задан Shepmaster 11 March 2018 в 22:34
поделиться

1 ответ

Постарайтесь поместить свой неизменный заимствование в блок {...}. Это завершает заимствование после блока.

#[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());
    }
}
2
ответ дан Shepmaster 17 August 2018 в 09:08
поделиться
  • 1
    почему пример программирования Rust не является тем же самым? Я не совсем понимаю. Я думал, что он также может быть записан как (&mut q).push('D') и (&q).pop, который заимствует q как изменяемую ссылку, а затем неизменяемую ссылку. – Shulhi Sapli 4 December 2017 в 01:38
  • 2
    хорошо, я думаю, что я понял это сейчас. stackoverflow.com/q/36565833/155423 ответы на этот вопрос. – Shulhi Sapli 4 December 2017 в 02:36
Другие вопросы по тегам:

Похожие вопросы: