C++向存储std::unique_ptr<int[]>的vector push_back报错及sizeof输出异常
问题原因解答
1. 编译报错原因
- 核心问题是类型完全不匹配:你定义的
integerArray类型是std::vector<std::unique_ptr<int[]>>,其元素类型是指向int数组的特化版unique_ptr,但push_back的参数是将栈上int类型的局部变量num强制转换成了std::vector<std::unique_ptr<int>>类型,int、std::vector<std::unique_ptr<int>>、std::unique_ptr<int[]>三者之间没有任何合法转换路径,编译器无法完成参数转换因此抛出错误。 - 附加逻辑错误:智能指针用于管理堆上分配的内存,不能直接将栈上的普通
int变量move成智能指针,正确做法是通过std::make_unique分配堆内存构造智能指针。 - 若你仅需要存储单个int的智能指针,不需要使用数组特化的
unique_ptr<int[]>,直接用unique_ptr<int>即可,二者本身也不兼容。
2. 输出为4的异常原因
sizeof是编译期运算符,计算的是对象本身在栈上占用的内存大小,和vector在堆上存储的元素数量没有任何关系。vector作为容器,本身仅存储几个管理堆内存的指针/成员变量,其自身大小是固定的,和你初始化时传入的10个元素完全无关。- 你要获取vector的实际元素个数,应该调用
integerArray.size()成员方法,而非用sizeof计算。你看到的输出4,只是当前编译环境下vector对象自身的大小除以int类型大小得到的计算结果,和你预期的元素数量没有关联。
修正后的参考代码
#include <iostream> #include <vector> #include <memory> int main() { // 定义存储单个int智能指针的vector,不需要提前初始化10个空元素 auto integerArray = std::vector<std::unique_ptr<int>>(); // 调用size()获取元素个数 std::cout << "初始元素个数: " << integerArray.size() << std::endl; for (int i = 0; i < 10; i++) { int num = i * 10; // 正确构造unique_ptr存入vector integerArray.push_back(std::make_unique<int>(num)); } std::cout << "插入后元素个数: " << integerArray.size() << std::endl; std::cout << "输出元素值: " << std::endl; // 遍历需要解引用才能拿到智能指针指向的值 for (auto const& i : integerArray) { std::cout << *i << std::endl; } return 0; }
内容的提问来源于stack exchange,提问作者Nakta_Na
相关产品推荐
相关产品推荐

