自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

小心處理 C++ 靜態(tài)變量中的陷阱

開發(fā) 前端
非局部變量的銷毀順序與它們被初始化的順序相反。不同源文件中的非局部變量以未定義的順序初始化,這意味著它們的銷毀順序也是未定義的。

函數(shù)中的 static 變量

static 變量的作用

C++ 中 static 關(guān)鍵字的最后一個(gè)用途是在函數(shù)內(nèi)創(chuàng)建局部變量,這些變量在其作用域內(nèi)退出和進(jìn)入時(shí)保持其值。函數(shù)內(nèi)的 static 變量類似于只能從該函數(shù)訪問的全局變量。static 變量的一個(gè)常見用途是“記住”特定函數(shù)是否已執(zhí)行過某個(gè)特定的初始化。例如,使用這種技術(shù)的代碼可能看起來像這樣:

void performTask() {
    static bool initialized { false };
    if (!initialized) {
        cout << "initializing" << endl;
        // 執(zhí)行初始化。
        initialized = true;
    }
    // 執(zhí)行期望的任務(wù)。
}

然而,static 變量可能會(huì)引起混淆,通常有更好的方法來構(gòu)造你的代碼,以避免使用它們。在這種情況下,你可能想編寫一個(gè)類,其中構(gòu)造函數(shù)執(zhí)行所需的初始化。

注意:避免使用獨(dú)立的 static 變量。改為在對(duì)象內(nèi)維護(hù)狀態(tài)。然而,有時(shí)它們可以是有用的。一個(gè)例子是用于實(shí)現(xiàn) Meyer 的單例設(shè)計(jì)模式

注意:performTask() 的實(shí)現(xiàn)不是線程安全的;它包含了競態(tài)條件。在多線程環(huán)境中,你需要使用原子操作或其他機(jī)制來同步多個(gè)線程。

非局部變量的初始化順序

靜態(tài)數(shù)據(jù)成員和全局變量的初始化

在離開 static 數(shù)據(jù)成員和全局變量的主題之前,考慮這些變量的初始化順序。程序中的所有全局變量和 static 類數(shù)據(jù)成員都在 main() 開始之前初始化。在給定源文件中的變量按照它們?cè)谠次募谐霈F(xiàn)的順序初始化。例如,在以下文件中,保證 Demo::x 在 y 之前被初始化:

class Demo {
public:
    static int x;
};

int Demo::x { 3 };
int y { 4 };

然而,C++ 對(duì)不同源文件中非局部變量的初始化順序沒有提供規(guī)范或保證。如果在一個(gè)源文件中有全局變量 x,在另一個(gè)源文件中有全局變量 y,你無法知道哪個(gè)會(huì)先初始化。通常,這種缺乏規(guī)范不會(huì)引起關(guān)注。然而,如果一個(gè)全局或 static 變量依賴于另一個(gè),則可能會(huì)有問題。

回想一下,對(duì)象的初始化意味著運(yùn)行它們的構(gòu)造函數(shù)。一個(gè)全局對(duì)象的構(gòu)造函數(shù)可能會(huì)訪問另一個(gè)全局對(duì)象,假設(shè)它已經(jīng)構(gòu)造。如果這兩個(gè)全局對(duì)象在兩個(gè)不同的源文件中聲明,你不能指望一個(gè)在另一個(gè)之前構(gòu)造,也不能控制初始化順序。這個(gè)順序可能因不同的編譯器或同一編譯器的不同版本而異,甚至當(dāng)你只是在項(xiàng)目中添加另一個(gè)文件時(shí),順序也可能改變。

警告:不同源文件中非局部變量的初始化順序是未定義的。

非局部變量的銷毀順序

非局部變量的銷毀順序與它們被初始化的順序相反。不同源文件中的非局部變量以未定義的順序初始化,這意味著它們的銷毀順序也是未定義的。

責(zé)任編輯:趙寧寧 來源: coding日記
相關(guān)推薦

2023-10-07 15:53:05

C/C++靜態(tài)變量內(nèi)存

2011-06-02 14:25:45

靜態(tài)變量

2011-05-24 16:58:52

CC++

2023-12-29 08:27:36

C語言靜態(tài)變量開發(fā)

2009-08-27 10:44:21

C#靜態(tài)變量

2011-08-10 17:16:01

Objective-C靜態(tài)變量

2011-05-26 15:10:15

靜態(tài)變量

2011-07-11 16:13:01

Java靜態(tài)變量實(shí)例變量

2009-08-31 10:00:07

C#靜態(tài)變量

2018-07-12 13:47:04

數(shù)據(jù)科學(xué)變量虛擬變量

2009-08-31 09:47:22

C#靜態(tài)變量初始化

2009-08-31 10:18:00

C#靜態(tài)變量定義C#靜態(tài)變量

2010-01-25 10:25:19

C++變量

2024-04-29 14:39:20

2010-01-28 11:08:09

C++變量

2011-03-07 10:10:35

MySQL處理空值

2010-01-18 17:57:02

靜態(tài)數(shù)據(jù)

2009-11-27 15:13:00

PHP靜態(tài)變量stat

2024-02-22 18:07:17

C++靜態(tài)成員代碼

2010-01-20 17:58:54

C++靜態(tài)成員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)