主頁 > 作業系統 > 在HttpClient中使用表情符號時顯示無效字符將請求置于顫動狀態

在HttpClient中使用表情符號時顯示無效字符將請求置于顫動狀態

2022-06-06 22:22:07 作業系統

第一:我的服務器允許放置操作

我正在使用flutter撰寫一個記憶應用程式(移植swiftUI版本)并遇到以下錯誤。

[VERBOSE-2:ui_dart_state.cc(198)] Unhandled Exception: Invalid argument (string): Contains invalid characters.:
"[{\"name\":\"user\",\"pass\":\"123\",\"udf\":[{\"colorRed\":255,\"colorGreen\":82,\"colorBlue\":82,\"colorAlpha\":255,\"name\":\"V
ehicles\",\"emojis\":[\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??
\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\",\"??\"],\"chals\":[{\"id\":\"Vehicles-1\",\"disp\":1},{\"id\":\"Vehicles-2\",\"disp\":
2},{\"id\":\"Vehicles-3\",\"disp\":3},{\"id\":\"Vehicles-4\",\"disp\":4},{\"id\":\"Vehicles-5\",\"disp\":5},{\"id\":\"Vehicles-6\",
\"disp\":6},{\"id\":\"Vehicles-7\",\"disp\":7},{\"id\":\"Vehicles-8\",\"disp\":8},{\"id\":\"Vehicles-9\",\"disp\":9},{\"id\":\"Vehi
cles-10\",\"disp\":10},{\"id\":\"Vehicles-11\",\"disp\":11},{\"id\":\"Vehicles-12\",\"disp\":12},{\"id\":\"Vehicles-13\",\"disp\":1
3},{\"id\":\"Vehicles-14\",\"disp\":14},{\"id\":\"Vehicles-15\",\"d<…>

這是結果flutter doctor --verbose

flutter doctor --verbose                                                  ─╯
[?] Flutter (Channel beta, 2.13.0-0.4.pre, on macOS 12.3 21E230 darwin-arm,
    locale zh-Hans-CN)
    ? Flutter version 2.13.0-0.4.pre at /Users/jett/flutter
    ? Upstream repository https://gitee.com/mirrors/Flutter
    ? FLUTTER_GIT_URL = https://gitee.com/mirrors/Flutter
    ? Framework revision 25caf1461b (4 weeks ago), 2022-05-05 14:23:09 -0700
    ? Engine revision c5caf749fe
    ? Dart version 2.17.0 (build 2.17.0-266.8.beta)
    ? DevTools version 2.12.2
    ? Pub download mirror https://pub.flutter-io.cn
    ? Flutter download mirror https://storage.flutter-io.cn

[?] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
    ? Android SDK at /Users/jett/Library/Android/sdk
    ? Platform android-31, build-tools 31.0.0
    ? Java binary at:
      /Library/Java/JavaVirtualMachines/jdk-11.0.15.1.jdk/Contents/Home/bin/java
    ? Java version Java(TM) SE Runtime Environment 18.9 (build
      11.0.15.1 2-LTS-10)
    ? All Android licenses accepted.

[?] Xcode - develop for iOS and macOS (Xcode 13.4.1)
    ? Xcode at /Applications/Xcode.app/Contents/Developer
    ? CocoaPods version 1.11.3

[?] Chrome - develop for the web
    ? CHROME_EXECUTABLE = /Applications/Google Chrome
      Canary.app/Contents/MacOS/Google Chrome Canary

[!] Android Studio
    ? Android Studio at /Applications/Android Studio Preview.app/Contents
    ? Flutter plugin can be installed from:
      ?? https://plugins.jetbrains.com/plugin/9212-flutter
    ? Dart plugin can be installed from:
      ?? https://plugins.jetbrains.com/plugin/6351-dart
    ? Unable to find bundled Java version.
    ? Try updating or re-installing Android Studio.

[?] VS Code (version 1.68.0-insider)
    ? VS Code at /Applications/Visual Studio Code - Insiders.app/Contents
    ? Flutter extension version 3.42.0

[?] Connected device (3 available)
    ? iPhone 13 (mobile) ? 2A8678B1-09B1-4B43-926F-BA04E5D00790 ? ios
      ? com.apple.CoreSimulator.SimRuntime.iOS-15-5 (simulator)
    ? macOS (desktop)    ? macos                                ? darwin-arm64
      ? macOS 12.3 21E230 darwin-arm
    ? Chrome (web)       ? chrome                               ? web-javascript
      ? Google Chrome 104.0.5102.0 canary

[?] HTTP Host Availability
    ? All required HTTP hosts are available

! Doctor found issues in 1 category.

忘記FLUTTER_GIT_URL,Pub download mirrorFlutter download mirror


相關代碼(我在呼叫時正在等待這個函式):

static Future<void> saveUsers() async {
    final HttpClient client = HttpClient();
    final HttpClientRequest request = await client.putUrl(Preferences.uri);
    request.write(const JsonEncoder().convert(Preferences.users.map((e) => e.toJson()).toList()));
    await request.close();
}
// inside the Preferences class

變數和類:

class User {
  String name = "";
  String pass = "";
  List<Theme> udf = [];

  User();
  User.values(this.name, this.pass, this.udf);

  int match(List<User> users) {
    for(int i = 0; i < users.length; i  ) {
      if(users[i].name == name && users[i].pass == pass) {
        return i;
      }
    }
    return -1;
  }

  Map<String, dynamic> toJson() => {
    "name": name,
    "pass": pass,
    "udf": udf.map((e) => e.toJson()).toList(),
  };

  String stringfy() => const JsonEncoder().convert(toJson());

  factory User.fromJson(Map<String, dynamic> mp) => User.values(
    mp["name"] as String,
    mp["pass"] as String,
    (mp["udf"] as List<dynamic>).map((e) => Theme.fromJson(e as Map<String, dynamic>)).toList(),
  );

  factory User.fromString(String s) => User.fromJson(const JsonDecoder().convert(s));
}

class Theme {
  static List<Color> availableColors = [Colors.redAccent, Colors.blueAccent, Colors.cyan, Colors.orangeAccent, Colors.deepPurple, Colors.green, Colors.indigo, Colors.lime, Colors.pinkAccent.shade100];

  Color color = Colors.redAccent;
  String name = "";
  List<String> emojis = [];
  final int id;
  List<Challange> chals = [];
  int gotToChal = 0;
  int score = 0;

  static int idCount = 0;

  Theme() : id = Theme.idCount {
    idCount  = 1;
  }
  Theme.values(this.color, this.name, this.emojis, this.chals, this.gotToChal, this.score) : id = Theme.idCount {
    idCount  = 1;
  }

  int match(List<Theme> themes) {
    for(int i = 0; i < themes.length; i  ) {
      if(themes[i].id == id) {
        return i;
      }
    }
    return -1;
  }

  Map<String, dynamic> toJson() => {
    'colorRed': color.red,
    'colorGreen': color.green,
    'colorBlue': color.blue,
    'colorAlpha': color.alpha,
    'name': name,
    'emojis': emojis,
    'chals': chals.map((e) => e.toJson()).toList(),
    'gotToChal': gotToChal,
    'score': score,
  };

  String stringfy() => const JsonEncoder().convert(toJson());

  factory Theme.fromJson(Map<String, dynamic> mp) => Theme.values(
    Color.fromARGB(
      mp['colorAlpha'] as int,
      mp['colorRed'] as int,
      mp['colorGreen'] as int,
      mp['colorBlue'] as int
    ),
    mp['name'] as String,
    (mp['emojis'] as List<dynamic>).map((e) => e as String).toList(),
    (mp['chals'] as List<dynamic>).map((e) => Challange.fromJson(e as Map<String, dynamic>)).toList(),
    mp['gotToChal'] as int,
    mp['score'] as int,
  );

  factory Theme.fromString(String s) => Theme.fromJson(const JsonDecoder().convert(s));

  static final List<Theme> defaultThemes = [
    Theme.values(
      Colors.redAccent,
      "Vehicles",
      ["??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??"],
      List.generate(21, (index) => index 1).map((e) => Challange.preset("Vehicles-$e", e)).toList(),
      0,
      0,
    ),
    Theme.values(
      Colors.orangeAccent,
      "Fast Food",
      ["??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??"],
      List.generate(10, (index) => index 1).map((e) => Challange.preset("FastFood-$e", e)).toList(),
      0,
      0,
    ),
    Theme.values(
      Colors.green,
      "Drinks",
      ["??", "??", "??", "??", "??", "??", "??", "??", "??", "??"],
      List.generate(8, (index) => index 1).map((e) => Challange.preset("Drinks-$e", e)).toList(),
      0,
      0,
    ),
    Theme.values(
      Colors.cyan,
      "Fruits",
      ["??", "??", "??", "??", "??", "??", "??", "??", "??", "??"],
      List.generate(8, (index) => index 1).map((e) => Challange.preset("Fruits-$e", e)).toList(),
      0,
      0,
    ),
    Theme.values(
      Colors.blueAccent,
      "Vegetables",
      ["??", "??", "??", "??", "??", "??", "??", "??"],
      List.generate(6, (index) => index 1).map((e) => Challange.preset("Vegetables-$e", e)).toList(),
      0,
      0,
    ),
    Theme.values(
      Colors.pinkAccent.shade100,
      "Animals",
      ["??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??"],
      List.generate(9, (index) => index 1).map((e) => Challange.preset("Animals-$e", e)).toList(),
      0,
      0,
    ),
  ];
}

class Challange {
  final String id;
  final int disp;
  Challange(this.id, this.disp);
  Challange.preset(this.id, this.disp);

  get nCards => min(min(2   disp, 20), Game.theme.emojis.length);
  get bonusTime => Duration(milliseconds: ((6   ((disp-1)/3))*1000).floor());

  int match(List<Challange> chals) {
    for(int i = 0; i < chals.length; i  ) {
      if(chals[i].id == id) {
        return i;
      }
    }
    return -1;
  }

  Map<String, dynamic> toJson() => {
    'id': id,
    'disp': disp
  };

  String stringfy() => const JsonEncoder().convert(toJson());

  factory Challange.fromJson(Map<String, dynamic> mp) => Challange.preset(
    mp['id'] as String,
    mp['disp'] as int
  );

  factory Challange.fromString(String s) => Challange.fromJson(const JsonDecoder().convert(s));
}

// following in Preferences
static final Uri uri = Uri.parse("https://www.openwld.com/memorize.json");
static late SharedPreferences prefs;
static User user = User.values("nothing", "none", Theme.defaultThemes);
static late List<User> users;
static List<Theme> get themes => user.udf;
static set themes(List<Theme> newValue) {
  user.udf = newValue;
}
static const String _name = "memorize_user";

我要說的是:

[{"name":"user","pass":"123","udf":[{"colorRed":255,"colorGreen":82,"colorBlue":82,"colorAlpha":255,"name":"Vehicles","emojis":["??","??","??","??","??","??","??","??","??","??","??","??","??","??","??","??","??","??","??","??","??","??","??"],"chals":[{"id":"Vehicles-1","disp":1},{"id":"Vehicles-2","disp":2},{"id":"Vehicles-3","disp":3},{"id":"Vehicles-4","disp":4},{"id":"Vehicles-5","disp":5},{"id":"Vehicles-6","disp":6},{"id":"Vehicles-7","disp":7},{"id":"Vehicles-8","disp":8},{"id":"Vehicles-9","disp":9},{"id":"Vehicles-10","disp":10},{"id":"Vehicles-11","disp":11},{"id":"Vehicles-12","disp":12},{"id":"Vehicles-13","disp":13},{"id":"Vehicles-14","disp":14},{"id":"Vehicles-15","disp":15},{"id":"Vehicles-16","disp":16},{"id":"Vehicles-17","disp":17},{"id":"Vehicles-18","disp":18},{"id":"Vehicles-19","disp":19},{"id":"Vehicles-20","disp":20},{"id":"Vehicles-21","disp":21}],"gotToChal":0,"score":0},{"colorRed":255,"colorGreen":171,"colorBlue":64,"colorAlpha":255,"name":"Fast Food","emojis":["??","??","??","??","??","??","??","??","??","??","??","??"],"chals":[{"id":"FastFood-1","disp":1},{"id":"FastFood-2","disp":2},{"id":"FastFood-3","disp":3},{"id":"FastFood-4","disp":4},{"id":"FastFood-5","disp":5},{"id":"FastFood-6","disp":6},{"id":"FastFood-7","disp":7},{"id":"FastFood-8","disp":8},{"id":"FastFood-9","disp":9},{"id":"FastFood-10","disp":10}],"gotToChal":0,"score":0},{"colorRed":76,"colorGreen":175,"colorBlue":80,"colorAlpha":255,"name":"Drinks","emojis":["??","??","??","??","??","??","??","??","??","??"],"chals":[{"id":"Drinks-1","disp":1},{"id":"Drinks-2","disp":2},{"id":"Drinks-3","disp":3},{"id":"Drinks-4","disp":4},{"id":"Drinks-5","disp":5},{"id":"Drinks-6","disp":6},{"id":"Drinks-7","disp":7},{"id":"Drinks-8","disp":8}],"gotToChal":0,"score":0},{"colorRed":0,"colorGreen":188,"colorBlue":212,"colorAlpha":255,"name":"Fruits","emojis":["??","??","??","??","??","??","??","??","??","??"],"chals":[{"id":"Fruits-1","disp":1},{"id":"Fruits-2","disp":2},{"id":"Fruits-3","disp":3},{"id":"Fruits-4","disp":4},{"id":"Fruits-5","disp":5},{"id":"Fruits-6","disp":6},{"id":"Fruits-7","disp":7},{"id":"Fruits-8","disp":8}],"gotToChal":0,"score":0},{"colorRed":68,"colorGreen":138,"colorBlue":255,"colorAlpha":255,"name":"Vegetables","emojis":["??","??","??","??","??","??","??","??"],"chals":[{"id":"Vegetables-1","disp":1},{"id":"Vegetables-2","disp":2},{"id":"Vegetables-3","disp":3},{"id":"Vegetables-4","disp":4},{"id":"Vegetables-5","disp":5},{"id":"Vegetables-6","disp":6}],"gotToChal":0,"score":0},{"colorRed":255,"colorGreen":128,"colorBlue":171,"colorAlpha":255,"name":"Animals","emojis":["??","??","??","??","??","??","??","??","??","??","??"],"chals":[{"id":"Animals-1","disp":1},{"id":"Animals-2","disp":2},{"id":"Animals-3","disp":3},{"id":"Animals-4","disp":4},{"id":"Animals-5","disp":5},{"id":"Animals-6","disp":6},{"id":"Animals-7","disp":7},{"id":"Animals-8","disp":8},{"id":"Animals-9","disp":9}],"gotToChal":0,"score":0}]}]

uj5u.com熱心網友回復:

您使用的是默認編碼,即 ISO-8859-1 而不是 UTF-8。在呼叫之前,write您需要正確設定字符集:

request.headers.contentType =
    ContentType('application', 'json', charset: 'utf-8');

并且從這個字符集中顫動將檢測它將用于序列化資料的編碼。

資料來源:顫振檔案

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/486644.html

標籤: http https 溪流

上一篇:解決未處理的例外:“String”型別不是“index”型別“int”的子型別

下一篇:Dartap搜索條件

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more