静态分配的内存在静态取消初始化期间会变得无效吗?

2024-03-13

假设我定义了一个像这样的变量(C++):

static const char str[] = "Here is some string data";

我有一个静态分配的类实例,它在其析构函数中引用该数组,这会出错吗?例如。可以吗str变量不知何故变得无效?

class A {
 ~A() {
   cout << str << endl;
 }
};

static A a;

我的假设是它不会出错,但我可以在任何地方找到明确的说明。我想确切地知道这一点。我的假设是,我们无法预测静态分配对象的析构函数被调用的顺序,但数据本身永远不会真正释放,直到进程被拆除。这意味着指向 POD 的指针应该是安全的,但对象实例则不然。

意思例如这:

static const QString str = "Here is some string data";

or

static const std::string str = "Here is some string data";

不能安全地用于A的析构函数,因为它们都在堆上分配字符串数据,并且析构函数可能会在之前释放该数据A的析构函数被调用。

我的假设正确吗?C++ 标准中是否有任何章节解释了这一点,或者是否有其他权威机构可以验证这一点的链接?


自动、全局和静态对象的析构函数的调用顺序始终是明确定义的:它与构造函数的调用顺序相反。所以如果对象A引用一个对象B and B was 之前建造的 A,你可以确定B is 之后被毁坏 A。这就给我们留下了构造函数顺序的问题。

这是我记得的:

  1. 全局对象和静态对象是在之前构造的main()叫做。
  2. 类局部静态是在其类的任何对象之前构造的。
  3. 函数局部静态是在第一次到达其作用域时构造的。
  4. 全局和静态对象在同一翻译单元内按照定义的顺序构造。 (这意味着标头包含的顺序可能会影响这一点!)
  5. 全局对象和静态对象的构造顺序跨翻译单元未定义。

我对其中一些内容有点模糊,所以如果您认为这是正确的,请纠正我。

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

静态分配的内存在静态取消初始化期间会变得无效吗? 的相关文章

  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐

  • 如何生成随机概率分布 julia

    我在字典中有一个键列表 我想为每个项目分配一个 0 到 1 之间的数字 使分配的数字总和为 1 如何做到这一点 我尝试使用 rand 进行一些操作 但没有成功 有什么建议么 更数学的答案是使用狄利克雷分布 https en wikipedi
  • 类组件的 useEffect 替代品

    我刚刚了解到在功能组件中我可以使用useEffect留意任何副作用 例如 使用时localStorage 这确保我的状态与效果挂钩 我想在我的基于类的组件中具有类似的功能localStorage 我怎样才能确保我的状态在发生任何变化时立即更
  • 从 Java 应用程序即时打开 PDF 文件

    有没有办法让代码以独立于平台的方式在Java应用程序中打开PDF文件 我的意思是在 Windows 中使用批处理文件可以做到这一点 有没有其他方法可以使用独立于平台的代码来动态打开 PDF 文件 I d try Desktop open F
  • 使用 Linq + Include 排序

    我与两个实体有一对多关系 Order int OrderId string OrderNumber OrderItem int ItemId int sequence Product int ProductId string Product
  • 使用带有 SL 和 TP 的 CCXT 使用 Python 在 FTX 上创建市场订单

    有人有如何创建带有止盈和止损的市价订单的示例吗 我已经阅读了文档 因为这是我第一次做这样的事情 所以我真的不明白 我正在尝试创建一个 API 端点 该端点接收来自 TradingView 的警报并下订单 我真的不想使用限价订单 因为我只想以
  • Oracle - 带有可选参数的索引使用

    我使用以下技巧来索引具有一些空值的列 create index xx people idx1 on xx people id number 1 这很好用 遗憾的是 当您使用可选参数时 这并没有帮助 select from xx people
  • Autofixture构造函数注入延迟加载

    我在单元测试中使用自动装置 它作为自动模拟器的工作方式非常棒 但是 当我将延迟加载的对象注入到我的类中时 我遇到了问题 例如 public class MyClass IMyClass private Lazy
  • Facebook“点赞”会产生“更新页面时出现内部错误”。

    几个月前 我在我的博客中添加了一个 赞 按钮 一切运行良好 今天早上我突然添加了一篇新帖子 不知出于什么原因 点赞按钮现在坏了 每次我点击 喜欢 时 我都会收到此错误 There was an internal error when upd
  • openXmlSdk 在运行元素内插入新行

    我里面有文字Run元素 我正在尝试更换 r在字符串中带有line break 正文如下 This is an example project for testing purposes rThis is all sample data non
  • Kibana 无法在 Windows 上连接到 elasticsearch

    我正在运行 Elastic Search 7 6 它工作正常http 本地主机 9200 http localhost 9200 我能够使用 REST API 将值添加到索引 现在 当我启动 kibana 7 6 时 出现以下错误 log
  • Apache 和 MySQL 是多线程应用程序吗?

    我想知道是否默认安装Apache and MySQL on 视窗 Linux是否是多线程的 这取决于如何看待它 MySQL允许您同时运行多个线程 这可用CPU RAM资源 但它不允许您使用多个线程运行单个查询 Apache是多线程的 这是
  • Azure Artifacts - 与其他项目共享项目范围的源

    我们的组织内有许多项目 其中一个项目创建了一个项目范围的 Azure Artifact 源 他们希望与我们的其他项目共享 但是 当其他项目访问其工件页面时 从提要下拉列表中 他们只能看到 组织范围的提要 而 项目范围的提要 下没有任何内容
  • LoadError: 无法加载此类文件 -- 英语

    我们的代码确实 require english 它在本地工作 但我们在 CI 服务器上收到此错误 LoadError 无法加载此类文件 英语 有任何想法吗 事实证明解决办法是改变 require english into require E
  • 如何使 jquery click 事件仅在第一次单击时触发

    我有两个 div basic1 和 basic2 我希望 basic1 在单击时淡出 而 basic2 在我工作得很好的情况下淡出 唯一的问题是 一旦 basic2 淡入 如果用户继续单击链接 navbar1 它将一遍又一遍地淡入该 div
  • 在图像视图的触摸事件上填充两个图像叠加,如搜索栏

    有两个图像黑色和蓝色 同时触摸蓝色图像 它应该像进度一样填充 我在不使用画布的情况下使用多个剪切图像实现了但没有得到smoothness触摸时 例如 实际上 我正在尝试实现类似于我上面提到的 100 个俯卧撑应用程序 我得到了一个link
  • 在递归函数中使用 .Find

    我正在尝试使用以下命令查找工作表中的行号 Find递归函数中的函数 我设置了一个名为Found Find 它效果很好 一点点 我在递归深度为 1 级时设置它 然后在递归深度为 2 级时再次设置它 然后 我的代码找到路径的末尾并开始备份 直到
  • 覆盖 ActiveRecord 对模型和集合的查找的最简洁方法是什么?

    我有重写 Ar 的 find 方法的库代码 我还包括所有 Association 类的模块 因此 MyModel find 和 parent my models find 都可以工作并应用正确的范围 我的代码基于 will paginate
  • MemoryError:无法分配具有形状和数据类型对象的数组

    我想在两个数据集之间执行内部联接 如下所示 theme ids head id Loan Theme ID Loan Theme Type Partner ID 0 638631 a1050000000skGl General 151 1
  • 写入 Amazon DynamoDB(PHP API)的速度慢得离谱

    这个问题已经发布在AWS论坛上 但仍未得到解答https forums aws amazon com thread jspa threadID 94589 https forums aws amazon com thread jspa th
  • 静态分配的内存在静态取消初始化期间会变得无效吗?

    假设我定义了一个像这样的变量 C static const char str Here is some string data 我有一个静态分配的类实例 它在其析构函数中引用该数组 这会出错吗 例如 可以吗str变量不知何故变得无效 cla