C++ 理解C++;标准&x27;s对“的解释”;“对象创建”&引用;“对象类型”;和C的区别
我最近开始阅读C++ 理解C++;标准&x27;s对“的解释”;“对象创建”&引用;“对象类型”;和C的区别,c++,c,c++11,object,language-lawyer,C++,C,C++11,Object,Language Lawyer,我最近开始阅读C++standard(),以更好地理解该语言并避免与UB相关的陷阱。我知道这可能是一个非常基本的问题,坦率地说,但是我还没有找到一个很好的答案来解释这些概念。也许每个人都明白,而我却不明白 考虑以下来自[intro.object]/1的文本 对象是一个存储区域。[…]对象由定义(3.1)创建 嗯[basic.def]/2详细介绍了定义。 在需要时通过实施(12.2) 我猜创建的临时表也包含在其中。 通过新表达式(5.3.4)或 [expr.new]介绍了这一点,尽管我还没
C++
standard(),以更好地理解该语言并避免与UB
相关的陷阱。我知道这可能是一个非常基本的问题,坦率地说,但是我还没有找到一个很好的答案来解释这些概念。也许每个人都明白,而我却不明白
考虑以下来自[intro.object]/1的文本
对象是一个存储区域。[…]对象由定义(3.1)创建
嗯[basic.def]/2详细介绍了定义。
在需要时通过实施(12.2) 我猜创建的临时表也包含在其中。
通过新表达式(5.3.4)或 [expr.new]介绍了这一点,尽管我还没有读过。
进一步的[basic.life]/1说明: 类型为T的对象的生存期始于: -获得T型的适当对齐和尺寸的存储,以及
现在考虑下面的例子:
int *x = (int*)(operator new (10*sizeof(int))); // (1a) How many objects are created? Does allocated storage has a type?
::new ((void*)x) int[10]{}; // (2a) How many objects are created? What is/are the type/s?
关于(1a),我认为是一个x
是使用int*
类型创建的存储分配不构成对象创建,类型是对象的属性 关于(2a),我认为是十个
int
类型的对象另外,由于指针返回到第一个对象,使用指针算法访问其他9个对象是否定义良好? 这是否也意味着,如果我知道
T
类型的对象位于地址A
,我可以使用cast访问对象的值,并且它是定义良好的
// How many objects does (1b) & (2b) create? What is/are the type/s?
// Does (1b) or (2b) invoke UB because of those extra 3 bytes?
int *y = (int*)(operator new (10*sizeof(int) + 3)); // (1b) - notice extra "+ 3" as part of size
::new ((void*)y) int[10]{}; // (2b)
“placement new”是在
C++
中构造/重用动态分配对象的唯一方法吗
由于C
在分配完成后没有用于构建对象的“新放置”,因此C++
在这方面是否与C
兼容?C
中的对象是否与C++
中的对象相同(除非C++
具有类类型)
C++
中动态分配对象(以及确定其类型)的对象创建与C
有何不同?本文介绍了C++20之前的情况,以及C++20解决问题的方法。还有一个高度相关的Q&A@StoryTeller UnslanderMonica:感谢链接,我会仔细阅读。@StoryTeller UnslanderMonica问题是接受了错误的答案一个对象是一个长期不正确的存储区域:)-这篇论文涵盖了C++20之前的情况,以及C++20解决问题的方法。还有一个高度相关的问题&a@StoryTeller UnslanderMonica:谢谢链接,“我会仔细检查的。@StoryTeller UnslanderMonica问题是接受了错误的答案一个对象是一个存储区域,很长一段时间都不正确:)