簡體   English   中英

VS2015 C ++靜態初始化崩潰,可能是錯誤

[英]VS2015 C++ static initialization crash, possible bug

我看到Visual Studio 2015社區發生了一些奇怪的事情。 在調用main之前,移植到VS2015時,在VS2012中完美工作的代碼在啟動時會崩潰:一些靜態初始化混亂的經典症狀。 我有一些靜態變量,但使用正確的標准標准“首次使用時構造”模式,例如:

const int& i()
{
  static int *v = new int(1);
  return *v;
}

上面的代碼在初始化程序時導致運行時斷言(請參見圖像http://i.stack.imgur.com/nsQGS.png )。 按重試只是退出程序:沒有調用堆棧,沒有任何信息。

但是,以下代碼可以完美地工作:

const int& i()
{
  static int *v = nullptr;
  if (v == nullptr)
    v = new int(1);
  return *v;
}

在我看來,VS2015通過在程序初始化期間(而不是作為C ++標准首次調用該函數)執行靜態變量初始化代碼來進行某種(非法)優化(即使在調試版本中)需要。 我嘗試了上面代碼的幾種變體:類方法,自由函數,不同的對象(std :: vector,cv :: Mat),總是得到相同的結果:靜態指針必須初始化為null或程序不需要開始。

所以...我錯過了什么還是VS2015真的搞砸了嗎?

更新:

我花了一些時間試圖找到顯示問題的最小設置,這就是我得到的:

  1. 使用“ CLR空項目”模板創建一個項目。
  2. 添加一個cpp文件,其中僅包含有問題的函數和main()。 Main可以為空,沒關系:該錯誤在到達之前就已發生。
  3. 添加“ main”作為入口點(否則會出現鏈接錯誤)。

x86版本有效,但x64版本無效。

為了進行比較,即使添加/ CLR選項,具有相同代碼但創建為“ Win32控制台應用程序”的項目也沒有問題。 我可以看到vcxproj文件中的差異,但是沒有一個可以證明錯誤,盡管其中一個或多個顯然是原因。

有沒有辦法上傳項目的zip文件?

好吧,@ bogdan正確了。 我的項目混合了既不是/ SUBSYSTEM:CONSOLE也不是/ SUBSYSTEM:WINDOWS的設置。 一旦我解決了這個問題,一切就會開始按預期進行。 我的測試項目也遇到了同樣的問題,我怪微軟在VS2015中沒有清晰的“ CLR Windows應用” C ++模板(他們想讓您為此使用C#,這在大多數情況下是有意義的,但並非總是如此) )。

我發現此頁面在解釋必須一致的所有不同設置時特別有用(不僅僅是/ SUBSYSTEM ...)。

我希望我可以將@bogdan的評論標記為答案,但是我看不到有什么可以做的。

謝謝波格丹!

暫無
暫無

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

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