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

C++中用memcpy操作shared_ptr<int[]>报错,初始化是否有误?

问题描述

我定义了如下智能指针:

auto ptr = make_shared<int[]>(5);

还有一个数组:

int arr[] = {1,2,3,4,5};

想要将arr中的数据复制到ptr中,尝试使用:

memcpy(ptr.get(), arr, 5 * sizeof(int))

但用如下代码打印时:

for (int i = 0; i < 5; i++) {
    std::cout<<ptr[i]<<std::endl;
}

出现了错误:

malloc(): corrupted top size

Process finished with exit code 134
(interrupted by signal 6: SIGABRT)

请问ptr的初始化是否存在问题?

问题分析与解决方案

问题出在std::make_shared<int[]>(5)的使用上——C++标准并不支持std::make_shared直接创建数组类型的智能指针。虽然部分编译器(比如GCC)可能允许这种写法作为扩展,但它不符合标准规范,会导致内存管理逻辑错误:make_shared为数组分配内存时,内部的内存布局和普通对象不同,后续通过[]访问或者内存拷贝操作会破坏堆结构,触发内存损坏报错。

正确的解决方式有两种:

  • 使用std::shared_ptr直接初始化数组:

    auto ptr = std::shared_ptr<int[]>(new int[5]);
    

    这种方式明确告知shared_ptr管理的是数组,会自动使用数组版的删除器(delete[])释放内存,避免内存泄漏和结构损坏。之后你的memcpy复制和遍历代码就能正常运行。

  • 改用std::vector替代智能指针数组:
    如果场景允许,std::vector是更安全便捷的选择,它自带完善的内存管理,复制数据也更简单:

    std::vector<int> vec(arr, arr + 5);
    // 直接遍历输出
    for (int num : vec) {
        std::cout << num << std::endl;
    }
    

内容的提问来源于stack exchange,提问作者heyloo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:30:52