使用std::ranges::transform写入未初始化内存的合法性问题
使用
std::ranges::transform写入未初始化内存的合法性疑问 我有一个关于std::ranges::transform写入未初始化内存的问题,核心疑问分为两个场景:
场景1:通过std::make_unique_for_overwrite分配的缓冲区
请问以下代码是否符合C++标准?
auto copy_to_uninitialized_memory(const std::vector<Point> &data) { // make_unique_for_overwrite 对数组元素执行"默认初始化" auto buffer = std::make_unique_for_overwrite<Point[]>(data.size()); auto multipleBy2 = [](const Point& input){ return Point{input.x*2, input.y*2, input.z*2}; }; // 下面这行transform是否合法? std::ranges::transform(data, buffer.get(), multipleBy2); return buffer; }
我清楚std::back_inserter搭配std::vector的行为是明确的——vector::push_back会调用std::allocator<T>::construct来初始化未分配的内存,但直接将未初始化内存的起始指针传给transform的场景,我不确定是否合法。
场景2:用std::byte分配原始内存后强转为目标类型
如果不使用make_unique_for_overwrite,而是通过new std::byte[]分配原始缓冲区以跳过初始化,代码如下,这种写法是否合法?属于未定义行为吗?是不是仅当T是平凡类型时才符合标准?
auto buffer = std::unique_ptr<T[]>(reinterpret_cast<T *>(new std::byte[data.size() * sizeof(T)])); std::ranges::transform(data, buffer.get(), some_operation);
我已经用未定义行为 sanitizer、内存 sanitizer、地址 sanitizer 测试过示例代码,均未检测到问题,但不确定是否真的符合C++标准。
内容的提问来源于stack exchange,提问作者Vaibhav Awale
相关产品推荐
相关产品推荐

