You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:05:04