簡體   English   中英

C ++中的靜態初始化

[英]Static initialization in C++

大家好!

我正在開發visual C ++(托管代碼)上的winForm應用程序。 此應用程序鏈接本機靜態庫,其中包含帶有靜態變量初始化的代碼塊:

Cls.h

class Cls
{
public:
    static Cls* getInstance();

private:
    static Cls _instance;
protected:
    Cls(void);
};

Cls.cpp

#include "StdAfx.h"
#include "Cls.h"

Cls::Cls(void)
{
}

Cls Cls::_instance;

Cls* Cls::getInstance()
{
    return &_instance;
}

method I get a run-time error before invoke main function of my app. 我可以成功鏈接這些庫,但是當我嘗試使用方法時,我在調用我的應用程序的main函數之前會遇到運行時錯誤。

class on any other way. 它是第三方庫,所以我無法重建它或以任何其他方式重新定義類。

, entry point defined as . App項目使用 ,入口點定義為

我厭倦了搜索解決方案。 我發現我必須改變切入點,但我不知道什么值是正確的。

請幫忙!

你遇到了臭名昭着的“靜態初始化命令慘敗”。 當靜態對象在兩個翻譯單元中定義時,它是未指定的,首先被初始化; 所以,如果一個的構造函數引用另一個,那么在初始化之前你最終可能會訪問它。 唯一的保證是它們都將在main開始之前進行初始化。

最好的解決方案是避免靜態對象。 特別是,你使用的Singleton反模式在C ++中使用起來相當棘手,而且通常比它的價值更麻煩。

如果你真的想這樣做,那么你可以通過在函數內定義靜態對象來解決這個問題:

Cls* Cls::getInstance()
{
    static Cls _instance;
    return &_instance;
}

這樣做的缺點是它引入了“破壞命令慘敗”(從另一個靜態對象的析構函數訪問它可能不安全),並且在某些編譯器中它可能不是線程安全的(盡管它應該在任何編譯器中)聲稱符合C ++ 11標准)。 如果構造是線程安全的,那么每次訪問都會有(小)運行時成本,如果您遇到極端性能問題,這可能會成為一個問題。

更新:我剛剛注意到你說這個邪惡的階級不在你的控制范圍之內,無法改變。 在這種情況下,您的選擇是:

  • 擺脫這個庫,並使用一些不那么瘋狂的東西,或
  • main開始之前,小心不要訪問任何靜態數據; 特別是,請遵循我的建議,避免使用自己的靜態物體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM