在现有的 T 对象上放置新的 U 并操纵它是 UB?
在此链接中,存储重用部分显示以下示例。 void x() { long long n; // automatic, trivial new (&n) double(3.14); // reuse with a different type o…
创建静态单例时需要什么 MaxAlign 技巧?
遵循 Loki 单例中的代码片段实现,它展示了所谓的“MaxAlign Trick”。我认为它与对齐有关(废话!),但是尝试与联合内提到的所有类型对齐的目的是什…
销毁然后使用相同的变量构造新对象
有时重新开始是件好事。在 C++ 中,我可以采用以下简单的操作: { T x(31, Blue, false); x.~T(); // enough with the old x ::new (&x) T(22, Brown,…
为什么这段代码试图调用复制构造函数?
我刚刚花费了大量的时间来解决 Visual Studio 中的编译错误。我已将代码提取到下面的小型可编译示例中,并在 IdeOne 上进行了尝试,并得到了相同的错…
如何将 new 放置在堆栈上
考虑以下代码: char mem[sizeof(char)]; void* p = mem; f = new(p) char; 由于变量 mem 的内存应该位于堆栈上 那么,为什么这块内存最终没有被自动…
如何正确释放placement new分配的内存?
我读过一些文章,当您使用 placement new 时,您必须手动调用析构函数。 考虑下面的代码: // Allocate memory ourself char* pMemory = new char[ si…
对于在同一地址构造两次的对象,编译器如何知道必须调用第二个析构函数?
在下面的代码中,类 C 中的对象 sub 被构造了两次。第一个构造调用默认构造函数 Sub(),第二个构造使用 placement new 在同一地址重建此对象。 因此析…
销毁然后使用相同的变量构造新对象
有时重新开始是件好事。在 C++ 中,我可以采用以下简单的操作: { T x(31, Blue, false); x.~T(); // enough with the old x ::new (&x) T(22, Brown,…
数组放置新需要缓冲区中未指定的开销?
C++11 Feb 草案的 5.3.4 [expr.new] 给出了示例: new(2,f) T[5] 导致调用 operator new[](sizeof(T)*5+y,2,f) . 这里,x和y是非负未指定值,表示数组…
是否将指针强制转换为“void*”?调用placement new 时有什么影响吗?
我正在审查自定义容器的代码,其中的某些部分创建如下所示的元素: ::new( (void*)&buffer[index] ) CStoredType( other ); 部分这样做: ::new( &buf…
删除这个并放置新的虚拟派生类
class base { int a; protected: template class derived; public: base() {} virtual ~base() {} virtual void func() {} static base* maker(); }; …