是以前初始化的内存,保证在放置新调用后保持不变
Is previously initialize memory guaranteed to persist after a placement new call?
假设我有以下内容:
struct A
{
int x;
};
//...
A* aOriginal = new A(); //value construct aOriginal
assert( aOriginal->x == 0 );
A* aSecond = new (aOriginal) A;
assert( aSecond->x == 0 );
即使aSecond
未初始化值,第二个断言是否保证保持?从逻辑上讲,它应该这样做,因为内存没有被覆盖,但它是由标准指定的吗?
否。
当您在同一存储位置上构建第二个对象时,前一个对象的寿命结束(§3.8/1):
[…]类型为
T
的对象的生存期在以下情况下结束:
- 如果
T
是具有非平凡析构函数的类类型(§12.4),则析构函数调用开始,或者- 对象占用的存储器被重新使用或释放
创建第二个对象时,由于A
具有隐式默认构造函数,x
成员默认初始化,因此不执行初始化(§8.5/6):
默认初始化类型为
T
的对象意味着:
[…]
否则,不执行初始化。
这意味着对象具有不确定值(§5.3.4/15):
创建
T
类型对象的新表达式将该对象初始化如下:
- 如果省略了新初始化器,则对象为默认初始化的(§8.5);如果没有执行初始化,该对象的值不确定
如果您认为该值不是不确定的,因为您之前初始化了该存储位置上的另一个对象:标准也放弃了这种可能性,即前一个对象的属性在其寿命结束后不再适用(§3.8/3):
本国际标准中赋予物体的特性仅适用于给定物体的使用寿命。
相关文章:
- 是什么让放置新调用对象的构造函数?
- 使用 MINGW gcc 编译时,不会为 std::string 调用重载的新运算符
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- 对于琐碎的对象,在"this"上调用新放置是否安全?
- Singleton模式中的手动析构函数调用:调用多次
- 实例化新类时未调用的方法
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 结构指针在"新"调用上给出已分配的地址?
- 在使用新操作员和C 中的结构的调用构造函数时,获得内存损坏(Malloc)
- 为什么要使用带有C++"向量"的新调用?
- 从同一父调用调用不同的子类函数
- 我可以通过CPP程序中的数据库调用调用Java程序
- NSIS系统::调用-调用方法失败
- 全局新运算符调用语法
- 参数构造函数调用调用
- 让非托管 C++ 代码调用调用 C# 代码的托管 C++ 代码
- 如何让函数调用调用它的函数
- 如何p/调用调用函数只使用,但c++需要.a/.lib/.o文件
- C#DLL可以调用调用本机C++静态库的C++/CLI托管包装器吗