国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

怎樣做1個(gè)網(wǎng)站搜索引擎搜索器

怎樣做1個(gè)網(wǎng)站,搜索引擎搜索器,網(wǎng)站代碼的重點(diǎn)內(nèi)容是什么,佛山南海網(wǎng)站建設(shè)C編程技巧專欄:http://t.csdnimg.cn/eolY7 目錄 1.概述 2.RAII的應(yīng)用 2.1.智能指針 2.2.文件句柄管理 2.3.互斥鎖 3.注意事項(xiàng) 3.1.禁止復(fù)制 3.2.對(duì)底層資源使用引用計(jì)數(shù)法 3.3.復(fù)制底部資源(深拷貝)或者轉(zhuǎn)移資源管理權(quán)(移動(dòng)語義) 4.RAII的優(yōu)勢(shì)和挑戰(zhàn) 5.總…

C++編程技巧專欄:http://t.csdnimg.cn/eolY7

目錄

1.概述

?2.RAII的應(yīng)用

2.1.智能指針

2.2.文件句柄管理

2.3.互斥鎖

3.注意事項(xiàng)

3.1.禁止復(fù)制

3.2.對(duì)底層資源使用引用計(jì)數(shù)法

3.3.復(fù)制底部資源(深拷貝)或者轉(zhuǎn)移資源管理權(quán)(移動(dòng)語義)

4.RAII的優(yōu)勢(shì)和挑戰(zhàn)

5.總結(jié)


1.概述

????????RAII是Resource Acquisition Is Initialization的縮寫,即“資源獲取即初始化”。RAII原則的基本思想是將資源的生命周期與對(duì)象的生命周期綁定在一起。它是C++語言的一種管理資源、避免資源泄漏的慣用法,利用棧的特點(diǎn)來實(shí)現(xiàn),這一概念最早由Bjarne Stroustrup提出。在函數(shù)中由棧管理的臨時(shí)對(duì)象,在函數(shù)結(jié)束時(shí)會(huì)自動(dòng)析構(gòu),從而自動(dòng)釋放資源,因此,我們可以通過構(gòu)造函數(shù)獲取資源,通過析構(gòu)函數(shù)釋放資源。這種自動(dòng)管理資源的方式可以大大減少資源泄漏、野指針和其他與資源管理相關(guān)的問題。常見的寫法為:

Object() {// acquire resource in constructor
}
~Object() {// release resource in destructor
}

?2.RAII的應(yīng)用

2.1.智能指針

智能指針是RAII原則在內(nèi)存管理中的一個(gè)典型應(yīng)用。C++11引入了多種智能指針類型,如std::unique_ptr、std::shared_ptr和std::weak_ptr,它們可以自動(dòng)管理動(dòng)態(tài)分配的內(nèi)存。

例如,使用std::unique_ptr可以確保在不需要?jiǎng)討B(tài)分配的內(nèi)存時(shí)自動(dòng)釋放它:

#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass created\n"; }~MyClass() { std::cout << "MyClass destroyed\n"; }
};int main() {{std::unique_ptr<MyClass> ptr(new MyClass()); // MyClass對(duì)象被創(chuàng)建// 當(dāng)ptr離開這個(gè)作用域時(shí),它會(huì)自動(dòng)釋放所指向的MyClass對(duì)象} // MyClass對(duì)象在這里被銷毀,輸出"MyClass destroyed"return 0;
}

在這個(gè)例子中,當(dāng)ptr離開其作用域時(shí),std::unique_ptr的析構(gòu)函數(shù)會(huì)被調(diào)用,從而釋放它所指向的MyClass對(duì)象。這種自動(dòng)的內(nèi)存管理方式避免了手動(dòng)調(diào)用delete可能導(dǎo)致的錯(cuò)誤。

2.2.文件句柄管理

另一個(gè)常見的應(yīng)用是使用RAII原則管理文件句柄。通過創(chuàng)建一個(gè)封裝了文件句柄的類,可以確保在不需要文件時(shí)自動(dòng)關(guān)閉它。

例如:

#include <fstream>
#include <iostream>class FileWrapper {
public:FileWrapper(const std::string& filename, std::ios_base::openmode mode): file_(filename, mode) {if (!file_.is_open()) {throw std::runtime_error("無法打開文件: " + filename);}}~FileWrapper() {file_.close(); // 在析構(gòu)函數(shù)中關(guān)閉文件句柄}// 提供對(duì)內(nèi)部文件的訪問(如果需要的話)std::fstream& file() { return file_; }private:std::fstream file_; // 封裝文件句柄的成員變量
};

在這個(gè)例子中,FileWrapper類的構(gòu)造函數(shù)打開一個(gè)文件,并在析構(gòu)函數(shù)中關(guān)閉它。這確保了即使在異常情況下,文件句柄也會(huì)被正確關(guān)閉。

2.3.互斥鎖

在多線程編程中,std::lock_guard, std::unique_lock, std::shared_lock等也利用了RAII的原理,用于管理互斥鎖。當(dāng)這些類的等對(duì)象創(chuàng)建時(shí),會(huì)自動(dòng)獲取互斥鎖;當(dāng)對(duì)象銷毀時(shí),會(huì)自動(dòng)釋放互斥鎖。

std::lock_guard的構(gòu)造函數(shù)如下:

template< class Mutex > class lock_guard;

std::lock_guard的析構(gòu)函數(shù)會(huì)自動(dòng)釋放互斥鎖,因此,我們可以通過std::lock_guard來管理互斥鎖,從而避免忘記釋放互斥鎖。如:

std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx); // unlock when lock is out of scope

不使用RAII的情況下,我們需要手動(dòng)釋放互斥鎖,如下所示:

std::mutex mtx;
mtx.lock();
// ...
mtx.unlock();

3.注意事項(xiàng)

在資源管理類中小心copy行為

  • 拷貝RAII對(duì)象必須考慮其管理的資源,針對(duì)其資源做出拷貝行為的實(shí)現(xiàn)
  • 常見的RAII對(duì)象拷貝行為:拒絕拷貝、引用計(jì)數(shù)法、深拷貝、資源所有權(quán)轉(zhuǎn)移

并非所有資源都是基于堆的(heap-based),對(duì)于這種對(duì)象不能直接使用智能指針,需要自定義其資源管理類。例如:為了說明鎖的資源管理行為,我們這里給定義一個(gè)鎖,來替代C++里的鎖

struct MyMutex {MyMutex() {printf("Construct MyMutex\n");}~MyMutex() {printf("Deconstruct MyMutex\n");}
};

其上鎖解鎖行為:

void lock(MyMutex *) {printf("lock\n");
}void unlock(MyMutex *) {printf("unlock\n");
}

鎖的資源管理類,在構(gòu)造函數(shù)獲取資源(加鎖),在析構(gòu)函數(shù)釋放資源(解鎖):

struct Lock {
private:MyMutex *myMutex;
public:explicit Lock(MyMutex *mutex) : myMutex(mutex) {lock(myMutex);}~Lock() {unlock(myMutex);}
};

使用:

int main() {MyMutex myMutex;{printf("---------\n");Lock lk(&myMutex);printf("---------\n");// 離開代碼塊將自動(dòng)析構(gòu)局部對(duì)象,因此會(huì)釋放鎖}
}
/*
Construct MyMutex
---------
lock
---------
unlock
Deconstruct MyMutex
*/

潛在風(fēng)險(xiǎn),如果發(fā)生了拷貝行為:

Lock l1(&mutex);
Lock l2(l1);

那么將立即死鎖(Linux里一般是非遞歸鎖,重復(fù)加鎖會(huì)造成死鎖)

3.1.禁止復(fù)制

繼承nocopyable,或者將拷貝相關(guān)函數(shù)設(shè)置為delete。如:

//[1]
class NonCopyable
{
protected:NonCopyable(const NonCopyable&){}NonCopyable& operator=(NonCopyable&){}
};或//[2]
class NonCopyable
{
public:NonCopyable(const NonCopyable&)=delete;NonCopyable& operator=(const NonCopyable&)=delete;
};

3.2.對(duì)底層資源使用引用計(jì)數(shù)法

思想:維護(hù)一個(gè)計(jì)數(shù)器,當(dāng)最后一個(gè)使用者被銷毀時(shí),才真正釋放資源,如:

struct Lock {
private:shared_ptr<MyMutex> mutexPtr;
public:// 將unlock函數(shù)設(shè)置為刪除器explicit Lock(MyMutex *mutex) : mutexPtr(mutex, unlock) {lock(mutexPtr.get());}// 不必聲明析構(gòu)函數(shù),因?yàn)閙utexPtr是棧上對(duì)象,所以會(huì)被默認(rèn)釋放,那么智能指針就會(huì)調(diào)用其釋放器unlock
};

3.3.復(fù)制底部資源(深拷貝)或者轉(zhuǎn)移資源管理權(quán)(移動(dòng)語義)

在資源管理類中提供對(duì)原始資源的訪問

  • API常需要要求訪問原始資源,所以RAII資源管理類應(yīng)該提供訪問原始資源的接口
  • 對(duì)原始資源可以由顯示轉(zhuǎn)換或者隱式轉(zhuǎn)換獲得.其在安全性和方便性上各有取舍

智能指針提供了get接口來訪問原始資源

在其中要注意,不可以get一個(gè)智能指針去初始化另一個(gè)智能指針,否則會(huì)發(fā)生重復(fù)釋放

int main() {shared_ptr<MyMutex> p1 = make_shared<MyMutex>();{shared_ptr<MyMutex> p2(p1.get());cout << p1.use_count() << " " << p2.use_count() << endl;
//        1 1
//        p2離開代碼塊,釋放其管理的資源,p1指針指向被釋放的內(nèi)存}
}

程序?qū)惓M顺?/p>

4.RAII的優(yōu)勢(shì)和挑戰(zhàn)

優(yōu)勢(shì):

  1. 自動(dòng)資源管理:通過綁定資源的生命周期與對(duì)象的生命周期,RAII自動(dòng)處理資源的獲取和釋放,減少了手動(dòng)管理的錯(cuò)誤。

  2. 代碼簡(jiǎn)潔性:RAII原則鼓勵(lì)將資源管理邏輯封裝在類中,使代碼更加清晰和易于維護(hù)。

  3. 異常安全性:當(dāng)使用RAII時(shí),即使在異常情況下,資源也會(huì)被正確釋放,這有助于提高程序的健壯性。

挑戰(zhàn):

  1. 資源所有權(quán)的轉(zhuǎn)移:在使用RAII時(shí),需要仔細(xì)考慮資源所有權(quán)的轉(zhuǎn)移。例如,在使用智能指針時(shí),需要明確何時(shí)使用std::move來轉(zhuǎn)移所有權(quán)。

  2. 與舊代碼的兼容性:在將RAII原則應(yīng)用于現(xiàn)有代碼庫時(shí),可能需要大量的重構(gòu)工作來適應(yīng)新的資源管理方式。

  3. 學(xué)習(xí)曲線:對(duì)于初學(xué)者來說,理解和正確應(yīng)用RAII原則可能需要一些時(shí)間和經(jīng)驗(yàn)。

5.總結(jié)

????????RAII原則為C++程序員提供了一種強(qiáng)大且優(yōu)雅的資源管理方法。通過將資源的生命周期與對(duì)象的生命周期綁定在一起,RAII不僅簡(jiǎn)化了資源管理,還提高了代碼的健壯性和可維護(hù)性。然而,為了充分利用RAII的優(yōu)勢(shì),程序員需要仔細(xì)設(shè)計(jì)類的接口和實(shí)現(xiàn),并考慮到資源所有權(quán)和資源轉(zhuǎn)移的問題。

http://aloenet.com.cn/news/39175.html

相關(guān)文章:

  • 站長(zhǎng)工具推薦代寫軟文
  • 做設(shè)計(jì)靈感的網(wǎng)站seo團(tuán)隊(duì)
  • 鄭州網(wǎng)站建設(shè)程序網(wǎng)站頁面禁止訪問
  • 公司的企業(yè)文化怎么寫微信搜一搜seo
  • 做的好的微信商城網(wǎng)站什么是seo推廣
  • 網(wǎng)站的后臺(tái)是開發(fā)做的八零云自助建站免費(fèi)建站平臺(tái)
  • 做網(wǎng)站python和php哪個(gè)好學(xué)百度推廣怎么弄
  • 深圳 汽車網(wǎng)站建設(shè)百度網(wǎng)站首頁提交入口
  • seo診斷服務(wù)優(yōu)化什么
  • 中國(guó)哪些網(wǎng)站做軟裝seo廠商
  • 四川疫情最新消息今天優(yōu)化服務(wù)
  • 網(wǎng)站設(shè)計(jì)建設(shè)定制中國(guó)搜索引擎市場(chǎng)份額
  • 網(wǎng)站建設(shè)策劃方案如何寫愛站網(wǎng)關(guān)鍵詞查詢網(wǎng)站的工具
  • 新媒體營(yíng)銷策略有哪些百度推廣優(yōu)化中心
  • 備案通過后 添加網(wǎng)站谷歌瀏覽器下載手機(jī)版安卓
  • 網(wǎng)站界面用什么做廈門百度推廣排名優(yōu)化
  • 高端的網(wǎng)站建設(shè)百度seo有用嗎
  • 造價(jià)咨詢公司加盟分公司上海百度搜索排名優(yōu)化
  • 鄭州企業(yè)建站模板河南疫情最新消息
  • google 垃圾網(wǎng)站推廣軟文300字范文
  • 做網(wǎng)站自己租服務(wù)器還是網(wǎng)絡(luò)公司如何發(fā)布自己的廣告
  • 建設(shè)網(wǎng)站的好處百度云服務(wù)器
  • 做宣傳網(wǎng)站需要多少錢附近電商培訓(xùn)班
  • 常用企業(yè)網(wǎng)站模板對(duì)比廣告聯(lián)盟下載app
  • 下載了網(wǎng)站建設(shè)asp深圳seo排名優(yōu)化
  • 怎樣搜網(wǎng)站seo工作流程
  • 清遠(yuǎn)做網(wǎng)站哪家好百度百家官網(wǎng)入口
  • 熊掌號(hào)網(wǎng)站怎么做百度的網(wǎng)頁地址
  • 上海網(wǎng)站制作軟件外鏈交易平臺(tái)
  • 攝影網(wǎng)站的規(guī)劃與設(shè)計(jì)seo網(wǎng)站排名查詢