【C++基礎】內存管理四重奏:malloc/free vs new/delete - 面試高頻考點與真題解析

在 C/C++ 編程中,內存管理是核心基礎技能,而malloc/freenew/delete作為兩套內存分配釋放機制,是面試中高頻出現的考點。

一、內存管理的 "雙生花":基礎概念解析

1.1 malloc/free:C 語言的內存管家

malloc全稱是 "memory allocation",是 C 標準庫中用于動態內存分配的函數,其原型為:

void* malloc(size_t size);
  • 從堆 (heap) 中分配指定字節數的內存
  • 分配成功返回指向內存起始地址的 void * 指針,失敗返回 NULL
  • 分配的內存空間未初始化,內容為隨機值

free用于釋放malloc分配的內存,原型為:

void free(void* ptr);
  • 只能釋放malloc/calloc/realloc分配的內存
  • 釋放后指針應置為 NULL,避免野指針
  • 多次釋放同一指針會導致未定義行為

動態內存分配函數詳解[1]:malloc()-CSDN博客

動態內存分配函數詳解[4]:free()_free函數-CSDN博客

1.2 new/delete:C++ 的內存魔法師

newdelete是 C++ 的關鍵字,用于動態對象創建和銷毀,基本形式為:?

T* ptr = new T;     // 分配內存并調用構造函數
delete ptr;         // 調用析構函數并釋放內存T* arr = new T[n];  // 分配數組內存
delete[] arr;       // 釋放數組內存
  • 本質是運算符重載,可以自定義行為
  • 自動計算所需內存大小,無需顯式指定
  • 分配過程包括:內存分配 + 構造函數調用
  • 釋放過程包括:析構函數調用 + 內存釋放

【C++入門】new 和 delete表達式_c++ new delete-CSDN博客

1.3 內存分配的 "租房" 比喻

為了幫助理解,我們可以將內存分配比作租房:

場景malloc/freenew/delete
找房過程直接找房東 (操作系統) 談,自己確定面積通過中介 (編譯器) 找房,中介知道需求
入住準備拿到空房子 (未初始化內存) 自己裝修中介幫忙裝修 (調用構造函數)
退房流程直接還鑰匙給房東,不管屋內狀態中介來驗收 (調用析構函數) 再還鑰匙
特殊需求租多個房間要自己管理門牌號中介提供套房管理 (數組分配有專門語法)

通過這個比喻,我們可以直觀理解兩套機制的核心差異,接下來我們深入底層看看它們的實現原理。

二、底層實現:從匯編視角看內存分配

2.1 malloc 的內存分配流程

malloc 的實現通常基于操作系統的內存分配接口,在 Linux 下最終會調用brkmmap系統調用。典型的 malloc 實現 (如 ptmalloc) 結構如下:

malloc 的核心特點:

  • 維護多個空閑塊鏈表 (fast bin/small bin/large bin) 提高分配效率
  • 采用內存池技術減少系統調用開銷
  • 分配的內存塊前會包含元數據 (大小、狀態等)
  • 內存釋放時通常不會立即還給操作系統,而是加入空閑鏈表

2.2 new/delete 的底層實現

C++ 的 new/delete 本質是對 operator new/operator delete 運算符的調用,其底層實現可以分為兩步:?

可以看到,C++ 的 new/delete 在底層通常會調用 malloc/free,但增加了構造析構函數的調用和異常處理機制。

2.3 關鍵差異對比表

特性malloc/freenew/delete
所屬范疇C 標準庫函數C++ 關鍵字 / 運算符
內存分配位置堆 (heap)堆 (heap)
類型安全無,需強制類型轉換有,自動推導類型
初始化不初始化,內容隨機調用構造函數初始化
清理直接釋放內存調用析構函數再釋放內存
異常處理返回 NULL 表示失敗拋出 bad_alloc 異常
數組支持需手動管理,無專門函數有 delete [] 專門處理數組
可重載性不可重載可以重載全局 / 類專屬版本
內存對齊通常 4/8 字節對齊按對象類型自然對齊

三、面試高頻考點深度解析

3.1 基礎概念類問題

考點 1:簡述 malloc/free 和 new/delete 的主要區別

這是最基礎的問題,考察對兩者本質的理解,回答要點:

  1. 所屬語言層面:malloc 是 C 庫函數,new/delete 是 C++ 關鍵字
  2. 內存管理粒度:new 自動計算大小,malloc 需顯式指定
  3. 初始化差異:new 會調用構造函數,malloc 僅分配內存
  4. 類型安全:new 返回正確類型指針,malloc 需強制轉換
  5. 異常處理:new 失敗拋異常,malloc 返回 NULL
  6. 數組支持:new []/delete [] 專門處理數組,malloc 需手動管理

考點 2:為什么 C++ 中建議使用 new/delete 而非 malloc/free

進階問題,考察對 C++ 特性的理解,核心原因:

  • 對 C++ 對象的完整生命周期管理(構造 / 析構函數調用)
  • 更好的類型安全性,避免強制類型轉換錯誤
  • 支持運算符重載,可自定義內存管理策略
  • 自動處理內存大小計算,減少人為錯誤
  • 異常機制更符合 C++ 錯誤處理范式

3.2 實踐應用類問題

考點 3:什么時候需要混用 malloc/free 和 new/delete?

實際開發中可能遇到的場景:

  1. 與 C 代碼交互時,C 接口返回的內存需要用 free 釋放
  2. 自定義內存分配器,可能用 malloc 實現 operator new
  3. 處理特定內存區域(如共享內存),需要手動管理
  4. 性能敏感場景,需要繞過 C++ 的構造析構開銷

考點 4:分析以下代碼的問題:

int* arr = (int*)malloc(10 * sizeof(int));
for(int i=0; i<10; i++) {arr[i] = i;
}
delete arr;

這是典型的混用錯誤,問題點:

  1. malloc 分配的內存用 delete 釋放,行為未定義
  2. 沒有調用 int 的構造函數(雖然 int 是 POD 類型影響不大)
  3. 數組內存釋放應該用 delete [] 而非 delete
  4. 缺少 NULL 指針檢查

正確寫法:

int* arr = (int*)malloc(10 * sizeof(int));
if(arr == NULL) { /* 錯誤處理 */ }
for(int i=0; i<10; i++) {arr[i] = i;
}
free(arr); // 用free釋放malloc分配的內存
arr = NULL;

3.3 底層原理類問題

考點 5:new 的實現過程分為幾步?請簡述

關鍵步驟:

  1. 調用 operator new 函數分配原始內存
  2. 在分配的內存上調用構造函數初始化對象
  3. 返回指向初始化后對象的指針
  4. 若內存分配失敗,調用 new_handler 并可能拋出異常

考點 6:為什么 delete 數組需要用 delete []?

這是高頻問題,涉及數組內存釋放的底層機制:

  • new [] 分配內存時會記錄數組大小(通常存放在指針前的位置)
  • delete [] 會根據記錄的大小調用對應次數的析構函數
  • 若使用 delete 釋放數組,只會調用一次析構函數,導致內存泄漏
  • 對于 POD 類型數組,delete 和 delete [] 效果相同,但為了代碼一致性仍應使用 delete []?

3.4 內存泄漏類問題

考點 7:列舉使用 malloc/free 可能導致內存泄漏的情況

常見場景:

  1. malloc 后未調用 free
  2. 指針修改后丟失原始地址,無法 free
  3. 函數返回前未釋放分配的內存
  4. 異常處理中未釋放已分配的內存
  5. free 后未將指針置為 NULL,導致野指針

考點 8:new/delete 場景下如何避免內存泄漏?

最佳實踐:

  1. 使用 RAII 原則,將指針封裝在類中,析構函數中 delete
  2. 使用智能指針 (std::unique_ptr/std::shared_ptr) 替代原始指針
  3. 確保 delete 與 new 成對出現,遵循 "誰分配誰釋放" 原則
  4. 對數組使用 delete [],避免析構函數只調用一次
  5. 在異常安全代碼中,使用 try-finally 確保內存釋放

四、歷年面試真題詳解

4.1 字節跳動 2023 秋招 C++ 開發真題

題目:?分析以下代碼的輸出結果,并解釋原因

#include <iostream>
#include <cstdlib>
using namespace std;class Test {
public:Test() { cout << "Test constructor" << endl; }~Test() { cout << "Test destructor" << endl; }
};int main() {Test* p1 = (Test*)malloc(sizeof(Test));Test* p2 = new Test;free(p1);delete p2;return 0;
}

解析:

輸出結果:?

?

原因分析:

  1. p1 = (Test*)malloc(sizeof(Test)):僅分配內存,未調用構造函數,所以沒有輸出構造信息
  2. p2 = new Test:分配內存并調用構造函數,輸出 "Test constructor"
  3. free(p1):直接釋放內存,不調用析構函數,無輸出
  4. delete p2:先調用析構函數,輸出 "Test destructor",再釋放內存

考點:?考察 malloc/free 和 new/delete 在對象構造析構上的差異,malloc 分配的內存不會調用構造函數,free 也不會調用析構函數,這是 C++ 對象管理的核心考點。

4.2 騰訊 2022 社招 C++ 高級工程師真題

題目:?實現一個簡單的內存分配器,要求同時支持 malloc/free 和 new/delete 接口,并解釋設計思路。

解析:?這是一道設計題,考察內存管理的綜合能力,以下是核心實現思路:?

#include <iostream>
#include <vector>
#include <mutex>
using namespace std;class MemoryAllocator {
private:vector<void*> free_blocks; // 空閑塊鏈表mutex mtx;                 // 互斥鎖,保證線程安全public:// 模擬malloc接口void* my_malloc(size_t size) {lock_guard<mutex> lock(mtx);// 簡化實現,實際應維護不同大小的塊鏈表if (!free_blocks.empty()) {void* ptr = free_blocks.back();free_blocks.pop_back();return ptr;}return ::malloc(size); // 調用標準malloc}// 模擬free接口void my_free(void* ptr) {if (!ptr) return;lock_guard<mutex> lock(mtx);free_blocks.push_back(ptr);// 實際應考慮內存合并等策略}// 重載operator newvoid* operator new(size_t size) {return my_malloc(size);}// 重載operator deletevoid operator delete(void* ptr) noexcept {my_free(ptr);}// 數組版本void* operator new[](size_t size) {return my_malloc(size);}void operator delete[](void* ptr) noexcept {my_free(ptr);}
};// 使用示例
class MyClass : public MemoryAllocator {
public:MyClass() { cout << "MyClass created" << endl; }~MyClass() { cout << "MyClass destroyed" << endl; }
};int main() {// 使用自定義分配器MyClass* obj1 = new MyClass;delete obj1;void* buf = my_malloc(1024);my_free(buf);return 0;
}

設計要點:

  1. 采用內存池技術,提高分配效率
  2. 同時實現 C 風格 (malloc/free) 和 C++ 風格 (new/delete) 接口
  3. 加入互斥鎖支持多線程環境
  4. 實際生產環境還需考慮內存對齊、碎片整理、內存映射等優化

4.3 微軟 2021 校招真題

題目:?解釋以下代碼為什么會導致內存泄漏,并給出修復方案

void processData() {int* data = new int[100];// 處理數據...if (someCondition()) {return;}delete data; // 當someCondition為true時,未釋放內存
}

解析:

  • 內存泄漏原因:當someCondition()為 true 時,函數直接返回,沒有執行delete data,導致 new 分配的數組內存未釋放
  • 修復方案 1:使用 RAII 原則,封裝為智能指針?
void processData() {std::unique_ptr<int[]> data(new int[100]);// 處理數據...if (someCondition()) {return; // 智能指針析構時自動釋放內存}// 無需手動delete
}
  • 修復方案 2:使用 try-finally 確保釋放?
void processData() {int* data = new int[100];try {// 處理數據...if (someCondition()) {return;}} finally {delete[] data; // 無論是否異常都會執行}
}

考點:?考察異常安全和內存泄漏的預防,RAII 是 C++ 中處理資源管理的重要原則,智能指針是現代 C++ 編程的基本技能。

4.4 Google 2020 面試題

題目:?為什么 C++ 中建議將析構函數聲明為虛函數?這與 new/delete 有什么關系?

解析:

  • 核心原因:當通過基類指針刪除派生類對象時,確保調用正確的析構函數
  • 示例代碼:?
class Base {
public:~Base() { cout << "Base destructor" << endl; }
};class Derived : public Base {
public:~Derived() { cout << "Derived destructor" << endl; }int* ptr;Derived() { ptr = new int[10]; }
};void test() {Base* base = new Derived;delete base; // 若Base析構函數非虛,僅調用Base::~Base()
}

問題分析:

  1. 當 Base 析構函數不是虛函數時,delete base只會調用 Base 的析構函數
  2. Derived 的析構函數未被調用,導致其分配的內存 (ptr) 未釋放
  3. 正確做法是將 Base 的析構函數聲明為虛函數:virtual ~Base() {}

與 new/delete 的關系:

  • new/delete 在釋放多態對象時,需要通過虛函數表找到正確的析構函數
  • 若析構函數非虛,delete 操作將無法正確釋放派生類資源

4.5 騰訊(2023):new[]與delete配對問題

題目:?

int* p = new int[10];
delete p;  // 錯誤!應使用delete[]// 實際行為:
// 1. 僅調用一次析構函數(若為自定義類型)
// 2. 僅釋放第一個元素內存,其余9個元素泄漏

底層原理

  • new[]在分配內存時頭部添加數組大小(如4字節存儲元素數量)

  • delete[]根據該信息調用正確次數的析構函數

  • 使用delete僅釋放頭部導致后續內存未被釋放

4.6 阿里(2024):malloc(0)行為分析

題目:

void* p1 = malloc(0);
void* p2 = new char[0];

解析

  • malloc(0)可能返回NULL或唯一非空指針(平臺相關)

  • new char[0]保證返回非空指針(可安全傳遞)

  • 兩者均不可解引用

4.7 華為(2023):定位new應用

題目:

#include <new>
void initPool(void* buf) {Data* p = new(buf) Data();  // 在預分配內存構造對象
}

使用場景

  1. 內存池性能優化

  2. 避免動態分配開銷

  3. 嵌入式系統無堆環境

【C++特殊工具與技術】優化內存分配(四):定位new表達式、類特定的new、delete表達式-CSDN博客

五、內存管理最佳實踐指南

5.1 現代 C++ 內存管理策略

①優先使用智能指針

  • std::unique_ptr:獨占所有權,適合單一對象
  • std::shared_ptr:共享所有權,自動引用計數
  • std::weak_ptr:弱引用,解決循環引用問題

②遵循 RAII 原則

  • 資源獲取即初始化 (Resource Acquisition Is Initialization)
  • 將內存資源封裝在類中,利用析構函數自動釋放

③減少手動內存管理

  • 使用 STL 容器 (如 vector/map) 代替手動分配數組
  • 避免混用 malloc/free 和 new/delete,保持接口一致性

【C++】智能指針_c++標準庫智能指針-CSDN博客

5.2 混合編程中的內存管理

當 C 和 C++ 代碼混合時,需注意:

  • C 代碼分配的內存用 free 釋放,C++ 代碼分配的用 delete 釋放
  • 類對象必須用 new/delete 管理,確保構造析構調用
  • 自定義類型轉換時注意內存對齊問題
  • 考慮封裝 C 接口,提供 C++ 風格的內存管理接口

5.3 內存泄漏檢測工具

實際開發中應借助工具檢測內存問題:

  • Valgrind:Linux 下強大的內存檢測工具,可檢測泄漏和越界
  • AddressSanitizer:Clang/LLVM 內置的內存錯誤檢測器
  • Visual Leak Detector:Windows 下的內存泄漏檢測庫
  • 智能指針 + 靜態分析工具:如 Clang-Tidy 可檢測潛在內存問題

5.4 面試應答策略

面對內存管理相關面試題,建議采用以下思路:

  1. 先理清問題涉及的核心概念(分配 / 釋放、構造 / 析構、異常處理等)
  2. 用具體代碼示例說明差異和問題
  3. 從底層原理出發解釋現象(如內存布局、虛函數表等)
  4. 結合最佳實踐給出解決方案
  5. 提及現代 C++ 的替代方案(智能指針、STL 等)

5.5 經典真題詳解

真題1:內存泄漏的根源與檢測方法(2025年字節跳動C++面試題)

解析
內存泄漏指動態分配的內存未正確釋放。常見原因包括:?

  1. 分配與釋放不匹配(如newfree
  2. 指針覆蓋導致原始地址丟失
  3. 循環引用(shared_ptr的噩夢)

檢測工具鏈

真題2:智能指針的選擇策略(騰訊2025校招真題)

解析

  • unique_ptr:獨占所有權,無性能開銷(推薦默認選擇)
  • shared_ptr:共享所有權,需警惕循環引用
  • weak_ptr:打破循環引用的利器

循環引用示例

class B;
class A {std::shared_ptr<B> b_ptr;
};
class B {std::shared_ptr<A> a_ptr; // 形成循環引用
};
// 解決:將A或B中的指針改為weak_ptr

5.6 深水區考點?

考點1:定位new(placement new)的原理
示例

char* buffer = new char[sizeof(MyClass)];
MyClass* obj = new (buffer) MyClass; // 在buffer上構造對象
obj->~MyClass(); // 需手動調用析構函數
delete[] buffer; // 釋放內存

考點2:內存對齊的影響

?


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

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

相關文章

Dify+Ollama+QwQ:3步本地部署,開啟AI搜索新篇章

如何來評價本地化部署的價值與優勢分析&#xff1a; 成本優化與隱私保障 自定義搜索插件&#xff0c;告別信息過載 一鍵生成報告、分析&#xff0c;效率翻倍&#xff01; 接下來我們就嘗試跟隨來部署本地的價值所在! 1&#xff1a;安裝Ollama & 部署QwQ模型 1.1 安裝O…

FAISS 簡介及其與 GPT 的對接(RAG)

什么是 FAISS&#xff1f; FAISS (Facebook AI Similarity Search) 是 Facebook AI 團隊開發的一個高效的相似性搜索和密集向量聚類的庫。它主要用于&#xff1a; 大規模向量相似性搜索高維向量最近鄰檢索向量聚類 https://github.com/facebookresearch/faissFAISS 特別適合處理…

【Apache Doris 深度實戰:從 MPP 架構到實時分析,解鎖三大數據模型的性能優化秘籍】

一、安裝部署 安裝教程&#xff1a;GitHub地址 Doc文檔&#xff1a;Apache Doris 簡介 - Apache Doris 二、功能及作用 Apache Doris 是一款基于MPP 架構的高性能、實時分析型數據庫。它以高效、簡單和統一的特性著稱&#xff0c;能夠在亞秒級的時間內返回海量數據的查詢結果…

MySQL主從復制與讀寫分離概述

前言&#xff1a; 在數據驅動的現代應用中&#xff0c;數據庫面臨高并發讀寫與海量存儲的雙重挑戰。單一數據庫實例在性能、可用性及擴展性上逐漸成為瓶頸。MySQL主從復制&#xff08;Master-Slave Replication&#xff09;與讀寫分離&#xff08;Read/Write Splitting&#xf…

數據庫-元數據表

1. 什么是元數據表元數據&#xff1a;數據的數據&#xff0c;用以描述數據的信息也是數據&#xff0c;被稱為元數據2. 獲取元數據的方法MySQL提供了以下三種方法用于獲取數據庫對象的元數據&#xff1a;show語句從INFORMATION_SCHEMA數據庫里查詢相關表&#xff08;information…

【STM32】通用定時器PWM

STM32 通用定時器 PWM 輸出完全解析&#xff08;以 TIM3_CH1 為例&#xff09; PWM 輸出基本原理 PWM&#xff08;Pulse Width Modulation&#xff09;即脈沖寬度調制&#xff0c;是由定時器通過比較 CNT 與 CCR 寄存器實現的。 信號產生原理&#xff1a; ARR 決定周期&#…

python學習打卡:DAY 21 常見的降維算法

知識點回顧&#xff1a; LDA線性判別PCA主成分分析t-sne降維 還有一些其他的降維方式&#xff0c;也就是最重要的詞向量的加工&#xff0c;我們未來再說 浙大疏錦行

基于SpringBoot和Leaflet集成在線天氣服務的區縣當前天氣WebGIS實戰

目錄 前言 一、需求描述 1、功能需求 2、技術實現流程 二、SpringBoot后臺實現 1、控制層實現 2、區縣數據返回 三、WebGIS前端實現 1、區位信息展示 2、天氣信息展示 四、成果展示 1、魔都上海 2、蜀地成都 3、湖南桂東 五、總結 前言 在當今數字化時…

文心開源:文心大模型4.5系列全面開放,AI普惠時代加速到來

一場由4240億參數模型領銜的開源盛宴&#xff0c;正在重塑中國AI生態的底層邏輯 2025年6月30日&#xff0c;百度如約宣布全面開源其旗艦產品——文心大模型4.5系列。一次性開源10款模型&#xff0c;覆蓋從4240億參數的MoE多模態巨無霸到輕巧的0.3B端側模型&#xff0c;并同步開…

【運算放大器專題】基礎篇

1.1 運算放大器是放大了個寂寞嗎&#xff1f;—初識運算放大器 為了解決震蕩問題&#xff0c;人為加了一些補償網絡之后導致的高頻特性差 1.2歐姆定律和獨立源 1正弦2方波3脈沖 電壓源是平行于i軸的橫線 1.3有伴源和運放緩沖器 有伴指的是有電阻&#xff0c;有伴是壞事&#…

英偉達 jetson nano 從NFS啟動,使用英偉達提供的rootfs根文件系統

0、目標 為了方便驅動階段的開發&#xff0c;并且使用英偉達提供的上層應用&#xff0c;這里希望使jetson nano 從NFS啟動&#xff0c;同時使用英偉達提供的rootfs根文件系統。 1、硬件準備 確保jetson nano 板子和開發主機之間使用網線進行連接&#xff08;保持板子和開發主…

廣州華銳互動:以創新科技賦能教育,開啟沉浸式學習?

在教育領域&#xff0c;廣州華銳互動致力于打破傳統教學的局限性&#xff0c;為師生們帶來全新的沉浸式學習體驗。廣州華銳互動通過開發 VR 虛擬教學課件&#xff0c;將抽象的知識轉化為生動、逼真的虛擬場景&#xff0c;讓學生能夠身臨其境地感受知識的魅力 。比如在歷史課上&…

Grok 4 最新技術評測與發布指南

TL;DR&#xff1a;馬斯克跳過Grok 3.5直接發布Grok 4&#xff0c;計劃在7月4日后上線&#xff0c;專注編程模型優化&#xff0c;這次"極限迭代"能否讓馬斯克在AI軍備競賽中翻盤&#xff1f; &#x1f4cb; 文章目錄 &#x1f680; Grok 4發布概況&#x1f3c6; Grok…

為什么音視頻通話需要邊緣加速

? 主要原因 ? 降低傳輸延遲 用戶與邊緣節點之間通常1-2跳即可完成連接&#xff0c;避免跨國、跨運營商長鏈路傳輸 保障音視頻信令、媒體流快速到達&#xff0c;控制端到端延遲 ? 提升弱網環境下的連接穩定性 邊緣節點具備鏈路優化、丟包補償、轉發中繼功能 即使在WiFi切…

小架構step系列05:Springboot三種運行模式

1 概述 前面搭建工程的例子&#xff0c;運行的是一個桌面程序&#xff0c;并不是一個Web程序&#xff0c;在這篇中我們把它改為Web程序&#xff0c;同時從啟動角度看看它們的區別。 2 Web模式 2.1 桌面例子 回顧一下前面的例子&#xff0c;其pom.xml的配置如下&#xff1a;…

LoRaWAN的設備類型有哪幾種?

LoRaWAN&#xff08;Long Range Wide Area Network&#xff09;是一種專為物聯網&#xff08;IoT&#xff09;設備設計的低功耗、長距離通信協議。它根據設備的功能和功耗需求&#xff0c;將設備分為三種類型&#xff1a;Class A、Class B 和 Class C。每種設備類型都有其獨特的…

三維目標檢測|Iou3D 代碼解讀一

本文對OpenPCDet項目中的iou3d模塊中的iou3d_nms_kernel.cu代碼進行解讀&#xff0c;本次解決的函數是box_overlap&#xff0c;它的輸入是兩個包圍盒&#xff0c;輸出是兩個包圍盒在bev下的重疊面積&#xff0c;計算流程是 確定box_a和box_b的四個角落坐標 從包圍盒中提取坐標值…

探索實現C++ STL容器適配器:優先隊列priority_queue

前引&#xff1a; 在算法競賽中&#xff0c;選手們常常能在0.01秒內分出勝負&#xff1b;在實時交易系統中&#xff0c;毫秒級的延遲可能意味著數百萬的盈虧&#xff1b;在高并發服務器中&#xff0c;每秒需要處理數萬條不同優先級的請求——這些系統背后&#xff0c;都隱藏著同…

一、Dify 私有部署、本地安裝教程(LInux-openeuler)

官網&#xff1a;Dify AI Plans and Pricing 1.找到下載的位置。 2.可以切換文檔為中午文檔。 3.本次安裝使用Docker Compose 安裝&#xff0c;可以大致看一下文檔描述的配置信息要求。 4.各個版本信息&#xff0c;本次下載1.5.1版本&#xff0c;你也可以選擇安裝其他版本。 …

GASVM+PSOSVM+CNN+PSOBPNN+BPNN軸承故障診斷

一、各算法基本原理與技術特點 1. GASVM&#xff08;遺傳算法優化支持向量機&#xff09; 原理&#xff1a; 利用遺傳算法&#xff08;GA&#xff09;優化SVM的超參數&#xff08;如懲罰因子 C C C 和核函數參數 g g g&#xff09;。遺傳算法通過模擬自然選擇機制&#xff…