使用静态向量时_Orphan_range崩溃

2023-11-25

在我的项目中,我使用静态对象的构造函数来收集指针,就像注册方法一样。很简单,没有魔法。但在开始时我遇到了崩溃,我无法解释这里发生了什么。在使用 MSVC 或 Clang 的 Windows 上可以重现崩溃,两者都使用 MSVC 标头。给出以下简单示例。谁能告诉我为什么这会导致问题?

这段代码似乎在 Linux 上的 GCC 和 Clang 中运行得很好:

https://gcc.godbolt.org/z/vSKdpW

bar.cpp

static int bar = 1;

static Registration abc(&bar);

foo.cpp

static std::vector<void*> registrations;

void add_to_array(void* p)
{
    registrations.push_back(p);
}

foo.h

class Registration
{
public:
    Registration(void* op)
    {
        add_to_array(op);
    }
};

执行会导致以下崩溃(_Pnext是 0x8。)

void _Orphan_range(pointer _First, pointer _Last) const { // orphan iterators within specified (inclusive) range
#if _ITERATOR_DEBUG_LEVEL == 2
    _Lockit _Lock(_LOCK_DEBUG);

    _Iterator_base12** _Pnext = &_Mypair._Myval2._Myproxy->_Myfirstiter;
    while (*_Pnext) {    <=======================   **_Pnext** was 0x8.

有谁知道为什么静态向量不能用于简单地收集指向对象的指针?foo.cpp是唯一使用向量的文件push_back。该数组在其他任何地方都没有被修改。


刚刚使用 VS2019 运行时调试了类似的问题,我会继续说这几乎肯定是由零初始化(但未构造)向量引起的。

就我而言,取证看起来是这样的:_Pnext was 0x8因为_Myproxy一片空白。和_ITERATOR_DEBUG_LEVEL设置为 2(即:在调试配置文件中),_Myproxy被取消引用,导致此崩溃,但 Release 不会崩溃,因为该代码被完全跳过。

现在,看看 MSVC142/VS2019 的向量实现,您会发现每个构造函数都调用_Alloc_proxy,这就是分配一些内存的原因_Myproxy并赋值。因此,如果调用了构造函数,则必然有一个非空值_Myproxy.

C++ 中的静态初始化分两个步骤进行:零初始化,然后以链接器确定的任意顺序进行静态初始化。看来按照你最终的顺序,Foo.cpp 的Registration在 Bar.cpp 之前构建registrations向量,有效调用push_back在零初始化(但未构造)向量上。

因此,正如评论所建议的,您绝对应该重新安排静态初始化,以便在使用向量之前正确构建向量。

(就我而言,我为包含向量的结构分配内存,但没有调用放置operator new在那段记忆上。对于像我一样发现这个问题的任何人,请寻找归零但未构造的向量的任何来源。)

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

使用静态向量时_Orphan_range崩溃 的相关文章

随机推荐

  • 修补 Magento 1.7.1 Hunk #1 时出错

    我看到最后一个Critical Reminder我的 Magento 仪表板 v 1 7 0 2 中的通知 2 important security patches SUPEE 5344 and SUPEE 1533 因此 我在其他 Mag
  • 错误 ::0 找不到引用的切入点注释

    我正在尝试创建一个方面来监视某些方法的时间执行 当我尝试运行测试时 出现以下错误 Caused by java lang IllegalArgumentException error at 0 can t find referenced p
  • 选择不同的 mongodb C#

    我必须从简单的 mongo db 数据库中选择不同的记录 我有很多简单的记录 这些记录如下所示 word some text 我的代码很简单 const string connectionString mongodb localhost v
  • Java 8 - 如何访问封装为 lambda 的对象和方法

    在 Java 中 您可以 捕获 对象上的方法调用 作为 Runnable 如下例所示 稍后 访问 Runnable 的这个实例 是否可以实际访问 捕获的 对象和被调用方法的方法参数 如果可能 这可能需要通过反射来完成 例如 class So
  • 是否存在具有编程语言本地化版本的编译器?

    我经常想知道为什么非英语程序员在编程时被迫使用不同的语言 而提供一个可以用本地化版本替换关键字的 IDE 似乎很容易 为什么德国人不能使用 w hrend macht 循环 日本 德国 法国 西班牙 博茨瓦纳的程序员只是广泛使用宏 定义语句
  • 根据另一个向量对点向量进行排序

    我正在开发一个 C 应用程序 我有 2 个点向量 vector
  • 显示:表格与使用表格

    我想知道使用 CSS 显示属性来模拟一个非常简单的论坛系统的表格是否是一个好主意 我知道这不是一件好事 就像 2 年前那样 当时 IE 和其他浏览器可能不支持 display table table cell 等 但我认为现在所有浏览器都支
  • Keycloak 管理控制台无限期加载

    我有一个在 EKS 集群中运行的 Keycloak 服务器 我尝试将其配置为生产模式而不是开发模式 我已经设法让 SSL 与反向代理一起使用 但是当我进入管理控制台的登录页面时 它只是无限期地加载 这是我的配置 Dockerfile FRO
  • PHP 特征的 UML 表示

    我正在使用 Symfony2 Doctrine 创建项目并尝试实现特征 到目前为止 小型试用没有问题 但我通常在深入复杂项目之前先绘制 UML 类和序列图 据我所知 用于象征 PHP 特征 可以视为行为 的 UML 设计对象是什么 有什么干
  • Java Webservice 客户端 UsernameToken 相当于 PHP

    我有一个 PHP 构建的 Web 服务 它使用 UsernameToken 作为身份验证机制 我有可以访问此 Web 服务的 PHP 客户端代码 现在我需要在 Java 中执行此操作 也许你可以帮助我 可以使用以下 php 代码访问该服务
  • 静态方法是否共享其局部变量以及不同线程并发使用时会发生什么?

    C 问题 我试图确定是否可以使用静态方法 在该方法内它确实使用了一些局部变量 局部变量是否在该方法的使用中 共享 例如 如果从不同线程同时调用 使用静态方法会发生什么 一个线程是否会阻塞 直到另一个线程完成等 也许普遍的问题是 在线程应用程
  • 更改Delphi OpenDialog的目录

    该计划的一些背景 该程序使用选项卡式界面同时处理多个文件 我正在尝试更改 OpenDialog 的目录 因此每次调用打开文件时都会显示我当前正在处理的文件的目录 但即使我设置InitialDir对于文件的路径 它始终显示最后打开的文件目录
  • GlassFish 5.0 异常且端口 4848 无响应

    昨天我下载了 GlassFish 5 0 和 JDK9 当我尝试运行服务器时asadmin start domainGlassFish 发送给我例外 当我尝试使用 asadmin start domainAfter 时 我得到响应 远程服务
  • 获取 GridSearchCV 的标准差

    在 scikit learn 0 20 之前我们可以使用result grid scores result best index 以获得标准差 它返回例如 mean 0 76172 std 0 05225 params n neighbor
  • 睡眠模式和深度睡眠模式有什么区别?

    我想知道Android手机中的睡眠模式和深度睡眠模式有什么区别 以及当手机进入睡眠模式和深度睡眠模式时会有什么影响 请给我详细的答案 问候 皮克斯 正如有人在已删除的答案中所写 深度睡眠模式与休眠和启动时间没有任何关系 You should
  • 如何使用 svg/canvas 绘制不规则/手绘线?

    我想绘制一条可调整大小的垂直线 基于页面内容 但它似乎是手绘的 而不是直线 我目前正在考虑使用 SVG 或 Canvas 来实现这一点 该线将沿着我的网页的一侧延伸 因此需要在容器的顶部和底部之间可扩展 我怎样才能实现这个目标 那么你想画一
  • 如何引用数据框表达式中的多个列?

    写这个很笨拙 df a lt df b df c 有没有办法做到 相当于 with df a lt b c 我们可以用with command df a lt with df b c 另一种选择是使用attach 然而不推荐 attach
  • MATLAB 中的信号量和锁

    我正在开发一个 MATLAB 项目 希望有两个 MATLAB 实例并行运行并共享数据 我将调用这些实例MAT 1 and MAT 2 更具体地说 该系统的架构是 MAT 1按顺序处理图像 使用以下命令一一读取它们imread 并使用输出每个
  • C++11 与现有库/框架的兼容性

    我想知道一些我还没有找到令人信服的答案的事情 情况 带有一些库 例如 gtkmm 的系统在未启用 c 11 的情况下进行编译 启用 C 11 编译的应用程序 两者都使用相同的 GCC 版本 环境进行编译和链接 该应用程序对使用 std st
  • 使用静态向量时_Orphan_range崩溃

    在我的项目中 我使用静态对象的构造函数来收集指针 就像注册方法一样 很简单 没有魔法 但在开始时我遇到了崩溃 我无法解释这里发生了什么 在使用 MSVC 或 Clang 的 Windows 上可以重现崩溃 两者都使用 MSVC 标头 给出以