VS2015 C++ 静态初始化崩溃,可能是错误

2023-12-01

我发现 Visual Studio 2015 Community 发生了一些奇怪的事情。在 VS2012 中完美运行的代码在移植到 VS2015 时会在调用 main 之前在启动时崩溃:一些静态初始化混乱的典型症状。我有一些静态变量,但使用标准的“首次使用时构造”模式正确使用,例如:

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

上面的代码在初始化程序时会导致运行时发出断言(参见图片https://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 实际上搞砸了?

UPDATE:

我花了一些时间试图找到显示问题的最小设置,这就是我得到的:

  1. 使用“CLR 空项目”模板创建一个项目。
  2. 添加一个 cpp 文件,仅包含有问题的函数和 main()。 Main 可以为空,但这并不重要:错误发生在到达之前。
  3. 添加“main”作为入口点(否则您会收到链接错误)。

x86 版本可以工作,但 x64 则不行。

为了进行比较,即使添加了 /CLR 选项,具有相同代码但创建为“Win32 控制台应用程序”的项目也不会出现问题。我可以看到 vcxproj 文件中的差异,但没有一个可以证明该错误是合理的,尽管其中一个或多个显然是原因。

有没有办法上传项目的 zip 文件?


嗯,@bogdan 说得对。我的项目混合了既不是 /SUBSYSTEM:CONSOLE 也不是 /SUBSYSTEM:WINDOWS 的设置。一旦我解决了这个问题,一切就开始按预期进行。我的测试项目也有同样的问题,我责怪微软在 VS2015 中不再有一个清晰的“CLR windows 应用程序”C++ 模板(他们想促使你使用 C#,这在大多数情况下都是有意义的,但并不总是如此) )。

I found 这一页在解释必须保持一致的所有不同设置时特别有用(不仅仅是 /SUBSYSTEM...)。

我希望我可以将 @bogdan 的评论标记为答案,但我看不到任何可以做到这一点的东西。

谢谢博格丹!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2015 C++ 静态初始化崩溃,可能是错误 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • 了解 TensorBoard(权重)直方图

    在 TensorBoard 中查看和理解标量值非常简单 然而 目前尚不清楚如何理解直方图 例如 它们是我的网络权重的直方图 After fixing a bug thanks to sunside What is the best way
  • watch 命令不适用于使用管道的命令[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 非常简单 快速的问题 为什么这个命令不起作用 watch ls log wc l or watch d ls log wc l 我正在尝试watch当前目录中文件总数的更新
  • 未能在 build.sbt 中包含 com.typesafe(对于 Scala 和 Heroku 上的 Spray)

    尝试引导我的 Scala 样板SprayHeroku 上的项目 我正在尝试按照以下方式向我的本地项目添加必要的调整Heroku 文档 喷雾样板项目源自github上的优秀模板它简单有效 并且包含优雅的代码和测试 在最后提到的模板项目运行良好
  • NVIDIA Parallel Nsight 与 Visual Profiler

    我正在Windows平台上使用CUDA 在 Windows 平台上 我们可以访问 Parallel Nsight 和 Visual Profiler 两者都非常好 但它们在分析和跟踪方面具有几乎相似的功能 有人能告诉我它们有什么不同吗 哪一
  • 强制标签文本从左到右,同时包含一些从右到左的文本

    我有一根绳子 代表货币符号 我从中得到NSLocale localeIdentifier ar AE objectForKey NSLocaleCurrencySymbol as String In my UILabel 当我将文本设置为t
  • SQL Server 模板 - 如何转义小于字符?

    我喜欢使用 SQL Server 2005 模板来运行常用查询 您可以使用以下语法在模板中包含参数
  • 是否可以使用 ColdFusion 重写 url?

    我需要生成用户友好的 url 我在 IIS 上 我的动态 URL 看起来像 www testsite com blog article cfm articleid 4432 客户希望网址看起来像 www testsite com blog
  • IE CSS Bug - 当页面上的动态 javascript 内容更改时如何保持位置:绝对

    我有一个页面 其中有一个列和一个内容 div 有点像这样 div div blahblahblah div div div div 通过一些样式 我有一个图像在列和内容之间分开 但需要保持相同的垂直位置 以便它对齐 样式类似于这样 colu
  • 背景图像隐藏了所有 GUI 设计组件

    我正在开发 GUI 应用程序 我使用 swing 组件来设计 GUI 我想为我的表单设置背景图像 但是当我设置图像时 它会重叠用于设计 GUI 的所有组件 首先我的没有背景图片的表格如下所示 我的代码是 登录 java public cla
  • 在 Magento 中将数组转换为集合

    我有一个数组对象 它是来自数据库的 magento fetchall 的输出 我希望将其转换为 Collections 类的对象 以便我可以实现分页并使用此集合与其他表连接 你能帮我一下吗 已经卡了好久了 要将数组转换为集合对象 1 gt
  • “System.IO.IOException:操作成功完成”异常

    我遇到了这个异常 System IO IOException 操作成功完成 在下面的代码块中 此代码在 Windows 服务中运行 foreach var error in currentPowerShell Streams Error i
  • 访问类的多处理代理的属性

    我有一个类 我想以只读方式与池中的子进程共享 因此我准备了一个类的代理 但它不起作用 以下是我的问题的简化示例 from multiprocessing managers import BaseManager class TestClass
  • 在这种情况下需要对 Node.js 中的函数进行阻塞调用吗?

    我开始学习node js 我在这里遇到了一个问题 我正在调用返回 JSON 的天气服务 网址如下 http api wunderground com api Your key conditions q CA San Francisco js
  • 用于 CGM 文件转换的 .NET 库

    我一直在开发一个实用程序 将各种文件转换为 PDF 以便于打印 通过电子邮件发送 我正在尝试添加对 CGM 文件的支持 但无法找到任何库来帮助我做到这一点 这是我可以在 C 中本地完成的事情吗 或者是否有任何基于 NET 的库可以帮助我转换
  • 如何判断是否支持window.confirm()?

    我有一个移动网站 可供各种设备使用 包括一些运行带有 IE 7 的 Windows Embedded 7 锁定版本的车载计算机 出于某种我无法解释的原因 window confirm 已损坏 但所有其他 javascript 似乎都可以工作
  • javascript/canvas,地图样式点缩放

    我有一张画布 上面有一堆物体 我有一个缩放功能 可以放大zoom每个坐标都乘以的变量 我希望能够指向一个坐标并对其进行缩放 类似于在线地图的操作方式 我已经设置了一个演示here 我的代码的当前状态 坐标处的比例 如果给定的屏幕坐标已缩放内
  • 在 C# 中部分下载并序列化大文件?

    作为我大学即将进行的项目的一部分 我需要编写一个客户端 从服务器下载媒体文件并将其写入本地磁盘 由于这些文件可能非常大 我需要实现部分下载和序列化以避免过多的内存使用 我想出了什么 namespace PartialDownloadTest
  • JavaScript 秒数到格式为 hh:mm:ss 的时间字符串

    我想将持续时间 即秒数 转换为以冒号分隔的时间字符串 hh mm ss 我在这里找到了一些有用的答案 但他们都谈到转换为 x 小时和 x 分钟格式 那么是否有一个小片段可以在 jQuery 或原始 JavaScript 中执行此操作 Str
  • 如何使用 WinAPI/C# 获取监视器/显示设备名称

    我正在使用 C WPF 编写一个应用程序 并希望获取所有连接的显示监视器的列表 我使用了 Screen 类并成功获取了列表 但现在列表中的每个显示器名称为 Display1 XXXXXXXX 等 这是不可读的 但是 My Nividia 控
  • VS2015 C++ 静态初始化崩溃,可能是错误

    我发现 Visual Studio 2015 Community 发生了一些奇怪的事情 在 VS2012 中完美运行的代码在移植到 VS2015 时会在调用 main 之前在启动时崩溃 一些静态初始化混乱的典型症状 我有一些静态变量 但使用