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
相关产品推荐
相关产品推荐

