【发布时间】:2015-10-15 21:33:59
【问题描述】:
上下文是: 将包含类型 T 和 char * p 的容器写入内存区域。让我们假设指针已经针对类型 T 进行了适当的对齐 - 对齐问题不是问题的一部分。 我如何默认在该内存区域上构造一个元素?
((*T)(p))->T();
适用于类,但不适用于某些内置类型。
((*T)(p)) = 0; // or simply memset
对于整数类型,指针。 这两个是否涵盖了所有内容,工会等等? 对此是否有最佳实践或某些标准库功能? std::allocator::construct 可以做到,例如std::vector 使用,但它不是静态方法,所以我需要它的一个实例。是否有一些独立或静态的功能可以做到这一点?
--编辑--
是的,答案很明显,我今天很笨——新位置 顺便说一句,现在我正在尝试销毁元素...
【问题讨论】:
-
新展示位置:
new (p) T(); -
第一个 sn-p 不应该编译...
-
关于编辑:没有
delete相当于新的放置。对于类,纯粹的破坏是通过显式的析构函数调用myFooPtr->~Foo();完成的。不幸的是,这似乎不适用于内置类型,所以我想,你在那一点上不走运。但是,由于您似乎不害怕繁重的模板,因此您可以使用 SFINAE 来区分可以或不能调用析构函数的情况,并相应地实例化带有/不带有此类析构函数调用的代码(内置类型不需要销毁)。不过要小心数组类型!
标签: c++ c++11 containers c++14