最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)Go的defer功能(示例代碼)

 更新時間:2021年07月11日 09:39:47   作者:witton  
defer和go一樣都是Go語言提供的關鍵字。defer用于資源的釋放,會在函數(shù)返回之前進行調用。接下來通過本文給大家介紹C++實現(xiàn)Go的defer功能,感興趣的朋友跟隨小編一起看看吧

在Go語言中有一個關鍵字:defer,它的作用就是延遲執(zhí)行后面的函數(shù),在資源釋放方面特別有用,比如下面一段C/C++的示例代碼:

void test()
{
	FILE* fp = fopen("test.txt", "r");
	if (nullptr == fp)
		return;

	if (...)
	{
		fclose(fp);
		return;
	}
	if (...)
	{
		fclose(fp);
		return;
	}
	if (...)
	{
		fclose(fp);
		return;
	}
	fclose(fp);
}

在每一處返回之前都需要調用fclose來關閉文件句柄,中間的流程中斷越多,越是容易遺漏調用fclose導致未正常關閉文件。

C++可以使用shared_ptr,auto_ptr之類的智能指針來管理分配的內存,但是像上面這種情況C++并沒有現(xiàn)成的可使用的代碼來處理。而Go語言提供了defer關鍵字來解決此類問題,Go可以按如下方式來寫:

func test() {
	file, err := os.Open("test.txt")
	if err != nil {
		return
	}
	defer file.Close()
	if ... {
		return
	}
	if ... {
		return
	}
	if ... {
		return
	}
}

只需要使用一句:

defer file.Close()

即可,Go會自動在return之后調用defer后面的函數(shù)。我們再看看下面的示例:

package main

import (
	"fmt"
)

func test() (n int, err error) {
	defer fmt.Println("測試1")
	defer fmt.Println("測試2")
	defer fmt.Println("測試3")
	return fmt.Println("test")
}

func main() {
	test()
}

它的輸出為:

test
測試3
測試2
測試1

在這里插入圖片描述

可以看出有多個defer時,按照先進后出的方式執(zhí)行的。

C++中我們可以利用析構函數(shù)來實現(xiàn),而且C++的局部變量析構規(guī)則也是按照先進后出的方式執(zhí)行的。為此,我們需要定義一個Defer類:

#include <functional>
typedef std::function<void()> fnDefer;
class Defer
{
public:
	Defer(fnDefer fn) : m_fn(fn)
	{
	}
	~Defer()
	{
		if(m_fn)
			m_fn();
	}
private:
	fnDefer m_fn;
};

這樣,前面的C++示例代碼可以寫成:

void test()
{
	FILE* fp = fopen("test.txt", "r");
	if (nullptr == fp)
		return;

	Defer d([&]()
	{
		fclose(fp);
	});
	if (...)
	{
		return;
	}
	if (...)
	{
		return;
	}
	if (...)
	{
		return;
	}
}

不用再在每一處返回前手動寫代碼關閉文件了。

但是這里還有一點不便之處就是需要手寫一個lambda表達式和手動定義一個變量,這個很好解決,使用宏來處理。

#define defer1(a,b) a##b
#define defer2(a, b) defer1(a, b)
#define defer(expr) Defer defer2(__Defer__,__COUNTER__) ([&](){expr;})

為了方便在同一函數(shù)多處使用,定義了defer宏來給變量命不同的名,前面的代碼可以改為:

void test()
{
	FILE* fp = fopen("test.txt", "r");
	if (nullptr == fp)
		return;

	defer(fclose(fp));
	if (...)
	{
		return;
	}
	if (...)
	{
		return;
	}
	if (...)
	{
		return;
	}
}

這樣就實用且方便得多了。下面給出完整代碼以及測試用例:

#include <functional>

using namespace std;

typedef std::function<void()> fnDefer;
class Defer
{
public:
	Defer(fnDefer fn) : m_fn(fn)
	{
	}
	~Defer()
	{
		if(m_fn)
			m_fn();
	}
private:
	fnDefer m_fn;
};

#define defer1(a,b) a##b
#define defer2(a, b) defer1(a, b)
#define defer(expr) Defer defer2(__Defer__,__COUNTER__) ([&](){expr;})

class Test
{
public:
	void f(int i)
	{
		printf("f:%d %p\n", i, this);
	}
};

int main(int argc, char *argv[])
{
	Test t;
	printf("test:%p\n", &t);
	defer(t.f(1));
	defer(t.f(2));
	defer(t.f(3));

	return 0;
}

結果如下:

在這里插入圖片描述

以上在VC 2015以及GCC、Clang下測試通過。

到此這篇關于C++實現(xiàn)Go的defer功能(示例代碼)的文章就介紹到這了,更多相關Go關鍵字defer內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • OpenCV邊緣提取算法流程的實現(xiàn)(附DEMO)

    OpenCV邊緣提取算法流程的實現(xiàn)(附DEMO)

    本文主要介紹了OpenCV邊緣提取算法流程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 深入探討C++父類子類中虛函數(shù)的應用

    深入探討C++父類子類中虛函數(shù)的應用

    本篇文章是對C++父類子類中虛函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中vector容器的常用操作方法實例總結

    C++中vector容器的常用操作方法實例總結

    vector容器一般被用作創(chuàng)建動態(tài)數(shù)組,動態(tài)數(shù)組就像Python中的list結構一樣,可以比普通數(shù)組擁有更豐富操作方法,下面就為大家整理了一些最常用的操作:
    2016-05-05
  • C++?std::copy與memcpy區(qū)別小結

    C++?std::copy與memcpy區(qū)別小結

    本文主要介紹了C++?std::copy與memcpy區(qū)別小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • QT的QWebEngineView類知識點詳細介紹

    QT的QWebEngineView類知識點詳細介紹

    QWebEngineView是Qt框架中的組件,基于Chromium內核,支持HTML5、CSS3、JavaScript等Web技術,適用于嵌入網(wǎng)頁內容到Qt應用程序,它提供了豐富的接口如加載、導航、與JavaScript交互等,并支持信號槽機制處理各種網(wǎng)頁事件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • C語言char s[]和char* s的區(qū)別

    C語言char s[]和char* s的區(qū)別

    本文主要介紹了C語言char s[]和char* s的區(qū)別,詳細講述了數(shù)組,指針的使用,具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • C語言動態(tài)內存分配函數(shù)的實現(xiàn)

    C語言動態(tài)內存分配函數(shù)的實現(xiàn)

    這篇文章主要介紹了C語言動態(tài)內存分配函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 用貪心法求解背包問題的解決方法

    用貪心法求解背包問題的解決方法

    本篇文章是對用貪心法求解背包問題的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++數(shù)據(jù)結構的隊列詳解

    C++數(shù)據(jù)結構的隊列詳解

    這篇文章主要為大家介紹了C++數(shù)據(jù)結構的隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • OpenCV視頻流C++多線程處理方法詳細分析

    OpenCV視頻流C++多線程處理方法詳細分析

    為OpenCV是搞計算機視覺必須要掌握的基礎,這篇文章主要給大家介紹了關于OpenCV視頻流多線程處理的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11

最新評論

平和县| 兴义市| 镇沅| 合川市| 长兴县| 晋州市| 玛曲县| 晋州市| 林芝县| 萨迦县| 巴里| 拉萨市| 昭苏县| 奉贤区| 岢岚县| 吴川市| 哈巴河县| 淮南市| 南平市| 平顶山市| 葫芦岛市| 长兴县| 玉树县| 谷城县| 隆子县| 亚东县| 延长县| 开远市| 扎鲁特旗| 沂水县| 保德县| 沁阳市| 陆丰市| 昂仁县| 隆昌县| 通辽市| 峨眉山市| 林西县| 稻城县| 自治县| 阿图什市|