Rust 學習筆記:關于智能指針的練習題

Rust 學習筆記:關于智能指針的練習題

  • Rust 學習筆記:關于智能指針的練習題
    • 問題一
    • 問題二
    • 問題三
    • 問題四
    • 問題五
    • 問題六
    • 問題七
    • 問題八
    • 問題九
    • 問題十
    • 問題十一

Rust 學習筆記:關于智能指針的練習題

參考視頻:

  1. https://www.bilibili.com/video/BV1SJ9vYsEfR
  2. https://www.bilibili.com/video/BV1Q79vYdEGx
  3. https://www.bilibili.com/video/BV1Q79vYdEgo
  4. https://www.bilibili.com/video/BV1Rg9vYhExC
  5. https://www.bilibili.com/video/BV1dLRVYrEfQ
  6. https://www.bilibili.com/video/BV1RGRnYoEiJ

問題一

以下程序能否通過編譯?若能,輸出是?

fn main() {let mut n = 1;let b = Box::new(&mut n);**b += 1;println!("{}", n);
}

答:可以通過編譯。輸出為 2。

問題二

假設我們有一個程序,其中有一個變量:

let x = [Box<(usize, usize)>; 4] = /* ... */

對于一個 64 位架構的編譯目標,x 在棧上所占用的最小內存大小是多少?

答:32 字節。

在 Rust 中,變量 x 的類型為 [Box<(usize, usize)>; 4],這是一個包含 4 個元素的數組,每個元素是一個 Box<(usize, usize)>。Box<T> 是一個智能指針,它在棧上僅存儲一個指針,在 64 位架構上,指針的大小固定為 8 字節,故數組大小 = 4 * 8 = 32 字節。

問題三

以下程序能否通過編譯?若能,輸出是?

use std::ops::Deref;#[derive(Copy, Clone)]
struct AccessLogger(i32);impl Deref for AccessLogger {type Target = i32;fn deref(&self) -> &Self::Target {println!("deref");&self.0}
}fn main() {let n = AccessLogger(-1);let x = *n + 1;let n2 = n;println!("{} {}", x, *n);
}

答:可以通過編譯。輸出為:

deref
deref
0 -1

問題四

以下程序能否通過編譯?若能,輸出是?

struct Example(i32);impl Drop for Example {fn drop(&mut self) {self.0 += 1;println!("drop {}", self.0);}
}fn main() {let e = Example(0);drop(e);drop(e);
}

答:不能通過編譯。

問題五

在這里插入圖片描述

答:{ s }、drop(s)、(|_|())(s)。

第一個利用了作用域,s 變量離開作用域時自動被清除。

第二個調用了 std::mem::drop 函數,顯式銷毀了 s 變量。

第三個是一個空閉包, 閉包獲取了 s 的所有權,離開閉包時 s 被銷毀。

第四個是不被允許的。

問題六

以下程序能否通過編譯?若能,輸出是?

use std::rc::Rc;fn main() {let n = Rc::new(1);let mut n2 = Rc::clone(&n);*n2 += 1;println!("{}", n);
}

答:不能通過編譯。

Rc::clone 是淺拷貝,并沒有獲取值的所有權。

問題七

以下程序能否通過編譯?若能,輸出是?

use std::rc::Rc;struct Example;impl Drop for Example {fn drop(&mut self) {println!("drop");}
}fn main() {let x = Rc::new(Example);let y = Rc::clone(&x);println!("A");drop(x);println!("B");drop(y);println!("C");
}

答:可以通過編譯。輸出為:

A
B
drop
C

銷毀 x 時,對 Example 的引用計數為 1。只有當 y 也被銷毀時,引用計數才為 0,執行 drop 方法。

問題八

以下哪項最好地描述了 Rust 中內部可變性的概念?

A. 將 unsafe 代碼包裝在安全的 API 中
B. 允許借用檢查器在運行時強制執行內存安全
C. 允許數據結構內部的數據被修改
D. 允許通過不可變引用修改數據

答:D。

問題九

在這里插入圖片描述

答:RefCell<usize>。

問題十

考慮以下未檢查內部值是否被借用的錯誤 RefCell 實現:

use std::cell::UnsafeCell;struct BadRefCell<T>(UnsafeCell<T>);impl<T> BadRefCell<T> {pub fn borrow_mut(&self) -> &mut T {unsafe { &mut *self.0.get() }}
}

假設我們有如下 BadRefCell:

    let v = BadRefCell(UnsafeCell::new(vec![1, 2, 3]));

以下哪個代碼片段在使用此 API 時會違反內存安全?

A.

    drop(v.borrow_mut());drop(v.borrow_mut());

B.

    let v1 = v.borrow_mut();let v2 = v.borrow_mut();v1.push(4);v2.push(5);

C.

    let v1 = v.borrow_mut();let n = &v1[0];v.borrow_mut().push(0);println!("{}", n);

D.

    v.borrow_mut().push(0);let n = v.borrow_mut()[0];println!("{}", n);

答:C。

獲取 v 的可變引用后,向其中插入數據,可能會變更值在堆上的位置。此時再訪問 n,可能發生內存泄漏,使得 n 變成一個懸垂引用。

數組 [1, 2, 3] 太小了,插入 1 個元素不一定會導致位置變化。我們改用一個包含 100000 個元素的數組,完整代碼如下:

use std::cell::UnsafeCell;struct BadRefCell<T>(UnsafeCell<T>);impl<T> BadRefCell<T> {pub fn borrow_mut(&self) -> &mut T {unsafe { &mut *self.0.get() }}
}fn main() {let v = BadRefCell(UnsafeCell::new(vec![1; 10000]));let v1 = v.borrow_mut();let n = &v1[0];v.borrow_mut().push(0);println!("{}", n);
}

運行結果:

在這里插入圖片描述

理論上應該打印 1。顯然這段代碼違反內存安全,但還是通過了 Rust 的編譯和運行時檢查。

問題十一

以下程序能否通過編譯?若能,輸出是?

use std::rc::Rc;fn main() {let r1 = Rc::new(0);let r4 = {let r2 = Rc::clone(&r1);Rc::downgrade(&r2)};let r5 =  Rc::clone(&r1);let r6 = r4.upgrade();println!("{} {}", Rc::strong_count(&r1), Rc::weak_count(&r1));
}

答:可以通過編譯。輸出 3 1。

r1、r2、r5 對其 Rc<T> 存在強引用,r4 為弱引用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908529.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908529.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908529.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript ES6 解構:優雅提取數據的藝術

JavaScript ES6 解構&#xff1a;優雅提取數據的藝術 在 JavaScript 的世界中&#xff0c;ES6&#xff08;ECMAScript 2015&#xff09;的推出為開發者帶來了許多革命性的特性&#xff0c;其中“解構賦值”&#xff08;Destructuring Assignment&#xff09;無疑是最受歡迎的功…

Shell 命令及運行原理 + 權限的概念(7)

文章目錄 Shell 命令以及運行原理&#xff08;4-1.22.08&#xff09;Linux權限的概念1. 什么是權限2. 認識人&#xff08;普通用戶&#xff0c;root用戶&#xff09;以及兩種用戶的切換認識普通用戶和root用戶兩種用戶之間的切換指令提權 3. 文件的屬性解析 權限屬性指令ll顯示…

以智能管理為基礎,樓宇自控打造建筑碳中和新路徑

在全球氣候變化的嚴峻形勢下&#xff0c;“碳中和”已成為各國發展的重要戰略目標。建筑行業作為能源消耗與碳排放的“大戶”&#xff0c;其運行階段的能耗占全社會總能耗近40%&#xff0c;碳排放占比與之相當&#xff0c;實現建筑碳中和迫在眉睫。傳統建筑管理模式下&#xff…

Python爬蟲實戰:研究Hyper 相關技術

一、項目概述 本項目展示了如何結合 Python 的異步編程技術與 Hyper 框架開發一個高性能、可擴展的網絡爬蟲系統。該系統不僅能夠高效地爬取網頁內容,還提供了 RESTful API 接口,方便用戶通過 API 控制爬蟲的運行狀態和獲取爬取結果。 二、系統架構設計 1. 整體架構 系統采…

html 滾動條滾動過快會留下邊框線

滾動條滾動過快時&#xff0c;會留下邊框線 但其實大部分時候是這樣的&#xff0c;沒有多出邊框線的 滾動條滾動過快時留下邊框線的問題通常與滾動條樣式和滾動行為有關。這種問題可能出現在使用了自定義滾動條樣式的情況下。 注意&#xff1a;使用方法 6 好使&#xff0c;其它…

【Linux】Ubuntu 創建應用圖標的方式匯總,deb/appimage/通用方法

Ubuntu 創建應用圖標的方式匯總&#xff0c;deb/appimage/通用方法 對于標準的 Ubuntu&#xff08;使用 GNOME 桌面&#xff09;&#xff0c;desktop 后綴的桌面圖標文件主要保存在以下三個路徑&#xff1a; 當前用戶的桌面目錄&#xff08;這是最常見的位置&#xff09;。所…

【自然語言處理】大模型時代的數據標注(主動學習)

文章目錄 A 論文出處B 背景B.1 背景介紹B.2 問題提出B.3 創新點 C 模型結構D 實驗設計E 個人總結 A 論文出處 論文題目&#xff1a;FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models發表情況&#xff1a;2023-EMNLP作者單位&#xff1a;浙江大…

【論文解讀】DeepSeek-R1

文章目錄 概覽一、DeepSeek-R1-Zero&#xff1a;在 Base Model 上直接進行 RL&#xff08;一&#xff09;強化學習算法&#xff08;二&#xff09;獎勵模型&#xff08;三&#xff09;數據構造&#xff08;四&#xff09;DeepSeek-R1-Zero 的性能、自我進化過程和 Aha Moment1.…

巴西醫療巨頭尤邁Kafka數據泄露事件的全過程分析與AI安防策略分析

一、事件背景與主體信息 涉事主體:Unimed,全球最大醫療合作社,巴西醫療行業龍頭企業,擁有約1500萬客戶。技術背景:泄露源于其未保護的Kafka實例(開源實時數據傳輸平臺),用于客戶與聊天機器人“Sara”及醫生的實時通信。二、時間線梳理 時間節點關鍵事件描述2025年3月24…

軟信天成:數據驅動型背后的人工智能,基于機器學習的數據管理

在數字化轉型浪潮中&#xff0c;當代企業如同逆水行舟&#xff0c;不進則退。無數企業希望通過數字化轉型捕獲全新的市場機遇&#xff0c;改善財政狀況&#xff0c;在未來市場競爭中占據一席之地。要想獲得成功的數字化轉型&#xff0c;關鍵因素在于具備可靠、及時的數據用以支…

如何理解 IP 數據報中的 TTL?

目錄 前言理解 前言 面試靈魂一問&#xff1a;說說對 IP 數據報中 TTL 的理解&#xff1f;我們都知道&#xff0c;IP 數據報由首部和數據兩部分組成&#xff0c;首部又分為兩部分&#xff1a;固定部分和可變部分&#xff0c;共占 20 字節&#xff0c;而即將討論的 TTL 就位于首…

【Java學習筆記】StringBuilder類(重點)

StringBuilder&#xff08;重點&#xff09; 1. 基本介紹 是一個可變的字符串序列。該類提供一個與 StringBuffer 兼容的 API&#xff0c;但不保證同步&#xff08;StringBuilder 不是線程安全的&#xff09; 該類被設計用作 StringBuffer 的一個簡易替換&#xff0c;用在字符…

計算機網絡 | 1.2 計算機網絡體系結構與參考模型

計算機網絡體系結構與參考模型 目錄 計算機網絡體系結構與參考模型 【思維導圖】 1、計算機的分層結構 1、為什么要分層&#xff1f; 2、什么是計算機網絡體系結構 2、計算機網絡協議、接口和服務 1&#xff09;協議&#xff1a; 2&#xff09;接口&#xff1a; 3…

微軟的新系統Windows12未來有哪些新特性

在今年即將到來的重大設計升級中,蘋果計劃對其全線操作系統統一按年份命名,作為另一巨頭微軟的win12還遠嗎?win11和win10是微軟現在正在用的主流版本,win11系統發布于2021年6月24日,win10系統發布于2015年7月29日。預計win12嘗鮮版可能在2025年下半年或明年。 盡管win12還…

制造業數智化卡在知識斷層?R2AIN SUITE AI知識管理打通關鍵經絡

在一家工廠里&#xff0c;工程師正面臨棘手難題——某機器異常振動的處理方案。他的筆記本記錄著三年前類似案例的解決方案&#xff0c;但翻查半小時仍未找到關鍵參數。與此同時&#xff0c;工廠的碳排放監控系統顯示&#xff0c;因設備停機導致的額外能源損耗已使產線碳強度有…

構造數列中的常見變形總結

前情概要 針對高考中構造數列的常見變形做一總結,便于梳理思路,提升思維。 類型Ⅰ: 形如 a n + 1 = p ? a n + q a_{n+1}=p\cdot a_n+q an+1?=p?an?+q, p , q p,q p,q為常數,即 a n + 1 = f ( a n ) a_{n+1}=f(a_n) an+1?=f(an?),構造變形方向: 其一: a n…

全國縣域統計年鑒PDF-Excel電子版-2022年

全國縣域統計年鑒PDF-Excel電子版-2022年.ziphttps://download.csdn.net/download/2401_84585615/89784662 https://download.csdn.net/download/2401_84585615/89784662 《中國縣域統計年鑒》是一部全面反映中國縣域社會經濟發展狀況的資料性年鑒。自2014年起&#xff0c;該年…

81 實戰一:給root目錄擴容

添加一塊100G硬盤 vgextend centos /dev/sdb1 /dev/sdc lvextend -L +120G /dev/centos/root xfs_growfs /dev/centos/root df -h 看是否擴容成功 82 實戰二:給swap空間擴容 添加一塊20G硬盤 fdisk -l 可以看到新添加的硬盤 vgextend centos /dev/sdd …

實現購物車微信小程序

實現一個微信小程序購物車頁面&#xff0c;包含以下功能&#xff1a; 需求說明&#xff1a; 商品列表&#xff1a;顯示商品名稱、價格、數量加減按鈕&#xff0c;支持修改商品數量&#xff08;數量≥1&#xff09;。 全選 / 反選功能&#xff1a;頂部 “全選” 復選框&#…

R語言使用隨機過采樣(Random Oversampling)平衡數據集

隨機過采樣&#xff08;Random Oversampling&#xff09;是一種用于平衡數據集的技術&#xff0c;常用于機器學習中處理類別不平衡問題。當某個類別的樣本數量遠少于其他類別時&#xff08;例如二分類中的正負樣本比例懸殊&#xff09;&#xff0c;模型可能會偏向多數類&#x…