相关疑难解决方法(0)

数据成员是否与C++中的对象分配在相同的内存空间中?

说我有一个这样的课:

class Test
{
  int x;
  SomeClass s;
}
Run Code Online (Sandbox Code Playgroud)

我像这样实例化它:

Test* t = new Test;
Run Code Online (Sandbox Code Playgroud)

是堆栈上的x还是堆?怎么样?

c++ memory-management

7
推荐指数
4
解决办法
1026
查看次数

成员子对象继承存储持续时间是否有任何不直观的副作用?

我以前不知道这个,但事实证明:

[C++11: 3.7.5]: 成员子对象,基类子对象和数组元素的存储持续时间是其完整对象的存储持续时间(1.8).

这意味着x->a在下面的示例中有动态存储持续时间.

我想知道是否有任何其他定义的语义引用存储持续时间,使成员a具有不同的对象*x和行为之间的行为y?一个例子是管理对象生命周期的规则.

struct T
{
   int a;
};

int main()
{
   std::unique_ptr<T> x(new T);
   T y;
}
Run Code Online (Sandbox Code Playgroud)

如果T是非POD(和其他类型的UDT)怎么样?

简而言之,我的蜥蜴大脑期望任何声明看起来int a;都有自动(或静态)存储持续时间,我想知道是否有任何标准措辞意外地预计这一点.


更新:

这是一个例子:

[C++11: 3.7.4.3/4]:[..]或者,实现可能具有严格的指针安全性,在这种情况下,指针值不是安全派生的指针值是无效指针值,除非引用的完整对象具有动态存储持续时间 [...]

从表面上看,我不希望我x->a和我之间的语义不同y.a,但很明显有些区域与对象的生命周期没有明显的关系.

我还关注lambda捕获规则,它在许多地方明确说明"具有自动存储持续时间",例如:

[C++11: 5.1.2/11]:如果lambda表达式具有关联的capture-default及其复合语句 odr-uses(3.2)this或具有自动存储持续时间的变量 [...]

[C++11: 5.1.2/18]:每次出现的decltype((x))where x都是一个可能带括号的id-expression,它命名一个自动存储持续时间的实体,被视为x转换为对闭包类型的相应数据成员的访问,如果x是odr使用的话,该成员将被声明.表示实体.

和别的.

c++ language-lawyer c++11

7
推荐指数
1
解决办法
236
查看次数

标签 统计

c++ ×2

c++11 ×1

language-lawyer ×1

memory-management ×1