考虑下面的代码:新表达式求值顺序(指针分配)
Class* p = nullptr; //global var
由线程1中执行该代码:
p = new Class;
上螺纹2,执行该代码:
if (p != nullptr) ...; // does the standard gurantee that the pointer will be assigned only after object is constructed ?
我的问题是,当p
将被分配指向分配的内存时,该标准是否强制执行? 实施例1:
- 新
p
被分配给新的指向表达呼叫操作员新分配的内存Class
“sc`tor被调用,分配的内存被传递给它
示例2:
- 新表达式调用操作符new
Class
“sc`tor被调用,分配的内存传递给它p
被分配到指向新分配的内存
为什么不在建设者里面睡一觉,看看自己,分享所获得的知识? :) – Ajay
根据http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf,答案是“否”:在所述存储器中构建对象之前,您可能会指向分配的存储器。 – Quentin
没有保证(实际上你的例子调用未定义的行为)。这正是p必须是原子变量的原因之一。原子变量的默认排序约束也将保证构造函数在分配给p之前是完整的。 Herb Sutter的原子武器谈话对解释这种行为做了很好的工作。 – John5342