当前位置: 首页 > 知识库问答 >
问题:

由placement-new创建的普通类型的生存期从什么点开始?

白博易
2023-03-14

在深入研究动态记忆的过程中,我突然想到,琐碎的类型是如何开始它们的生命的,这似乎是自相矛盾的。考虑片断

void* p = ::operator new(sizeof(int));  // 1
// 2
new (p) int; // 3

int由placement New创建。但不知何故,它的生命并不是从这里开始的,因为从[基本生命]

[...]如果一个对象是类或聚合类型,并且它或它的一个子对象是由一个构造函数而不是一个普通的默认构造函数初始化的,则称为具有非空初始化。T类型的对象的生存期从以下时间开始:

> 获得具有t类型的适当对齐方式和大小的

  • 存储,并且

    需要分配器返回内存而不构造内存元素。然而,对于普通类型来说,这是没有意义的。a.allocate(n)a类型t的分配器对象的效果是

    t类型的n对象分配内存,但未构造对象。

  • 共有1个答案

    鲁建茗
    2023-03-14

    从技术上讲,新表达式总是获得存储。代码new(p)int既获得存储又创建对象,根据[basic.life]/1,对象的生存期从new(p)int获得存储时开始。

    根据N4659[expr.new],代码new(p)int生成对分配函数::运算符new(sizeof(int),p)的调用。并且在[new.delete.placement]下,标准库定义了这样一个函数:

    void*运算符新建(std::size_t size,void*ptr)noExcept;

    备注:有意不执行其他操作。

    尽管“没有执行任何其他操作”,并且实现可能会优化任何实际的函数调用,但对分配函数的调用仍然被视为获得由new-expression创建的对象的存储。

     类似资料:
    • 我发现了很多关于如何克服此限制的帖子,但没有一个关于为什么存在此限制的帖子(除了这个,它只是提到它与类型擦除有关)。 那么,为什么不能创建泛型类型的实例呢? 澄清一下,我的问题不是如何做到这一点。我知道这在C#中是可能的,那么为什么不在Java呢?我很好奇为什么Java没有实现类似的机制?为什么强迫Java开发人员使用可能导致运行时错误的笨拙变通方法?这种机制有什么潜在的危险吗?

    • 出于某种原因,我曾经认为是线程不安全的,a-la或,而是通过块包装对的访问,或来实现的。 实际上,是线程安全的(通过原子)。因此,需要注意的是:即使在单个线程中需要一些随机输入,使用也是有意义的,因为内部没有原子读写,没有被编译为锁定指令并发出内存障碍。 而且,由于Java8,本质上是一个单例,它的状态保留在类的某些字段中。因此,方法不是对的访问,而只是静态字段读取,即。e.非常便宜。 我有两个问

    • 本文向大家介绍react的路由和普通路由有什么区别?相关面试题,主要包含被问及react的路由和普通路由有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 如果不使用 React Router,组件之间的嵌套,会使URL变得复杂,为了让我们的 URL 解析变得更智能,我们需要编写很多代码来实现指定 URL 应该渲染哪一个嵌套的 UI 组件分支。 而React Router 知道如何为我们搭建嵌

    • 你好打字专家们, 有人可以解释为什么下面的代码在第 16 行给我一个错误,而不是在第 13 行给我一个错误。这是预期功能还是缺少功能? 密码 游乐场链接

    • 问题内容: 有没有可用的工具来跟踪Java线程的创建和生存期?我将对以下所有内容感兴趣: 调用new Thread()的调用堆栈 调用了start()的调用栈 run()方法的生命周期 问题答案: 我已经编写并发布了一个开源工具来回答这个问题。 Java Live线程分析器 我在这里博客介绍了该工具。

    • 这些到底有什么区别呢?我想我理解存在类型是如何工作的,它们就像OO中的基类没有向下强制转换的方法一样。通用类型有何不同?