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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:15:03