溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++為什么在一個(gè)表達(dá)式中最多只執(zhí)行一次顯式資源分配

發(fā)布時(shí)間:2021-11-26 15:14:09 來(lái)源:億速云 閱讀:157 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C++為什么在一個(gè)表達(dá)式中最多只執(zhí)行一次顯式資源分配”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C++為什么在一個(gè)表達(dá)式中最多只執(zhí)行一次顯式資源分配”吧!

R.13: 在一個(gè)表達(dá)式中最多只執(zhí)行一次顯式資源分配

Reason(原因)

如果你在一個(gè)表達(dá)式中執(zhí)行兩次(或以上的)資源分配,由于包括函數(shù)參數(shù)在內(nèi)的子表達(dá)式的執(zhí)行順序是沒(méi)有定義的,因此可能導(dǎo)致資源泄露。

Example(示例)

void fun(shared_ptr<Widget> sp1, shared_ptr<Widget> sp2);

函數(shù)可能被這樣調(diào)用:

// BAD: potential leak
fun(shared_ptr<Widget>(new Widget(a, b)), shared_ptr<Widget>(new Widget(c, d)));

因?yàn)榫幾g器可能會(huì)調(diào)整構(gòu)建函數(shù)參數(shù)的兩個(gè)表達(dá)式的執(zhí)行順序,這段代碼在發(fā)生異常時(shí)會(huì)出問(wèn)題。通常,編譯器會(huì)交錯(cuò)執(zhí)行兩個(gè)表達(dá)式:(使用new進(jìn)行)兩個(gè)對(duì)象的內(nèi)存分配可能首先進(jìn)行,接下來(lái)調(diào)用兩個(gè)Widget的構(gòu)造函數(shù)。如果一個(gè)調(diào)用某個(gè)構(gòu)造函數(shù)是拋出異常,那么另一個(gè)就永遠(yuǎn)不會(huì)被釋放。

這個(gè)不易察覺(jué)的問(wèn)題有一個(gè)簡(jiǎn)單的解決方案:永遠(yuǎn)不在一個(gè)表達(dá)式中執(zhí)行兩次(含兩次)以上的顯式資源分配。例如:

shared_ptr<Widget> sp1(new Widget(a, b)); // Better, but messy
fun(sp1, new Widget(c, d));

最好的解決方案是使用返回管理對(duì)象的工廠方法徹底避免顯式資源分配。

fun(make_shared<Widget>(a, b), make_shared<Widget>(c, d)); // Best

如果目前還不存在,那就自己寫工廠包裝類。

Enforcement(實(shí)施建議)

  • 標(biāo)記具有多個(gè)顯式分配資源的表達(dá)式(問(wèn)題是:我們可以識(shí)別出多少顯式分配資源的情況?)

到此,相信大家對(duì)“C++為什么在一個(gè)表達(dá)式中最多只執(zhí)行一次顯式資源分配”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI