首页 > 解决方案 > 使用 std::unique_ptr 创建对象数组

问题描述

我目前正在学习智能指针,并正在尝试执行以下操作:

#include <memory>
#include <string>

int main() {
    std::unique_ptr<std::string[]> str_array(new std::string[5]);
    for (int i = 0; i < 5; i++) {
        std::getline(std::cin, str_array.get()[i]);
    }
    return 0;
}

此代码只是将 5 个对象扫描std::string到一个数组中。但是,调试器显示内存没有为 5 个对象保留:

调试器

我究竟做错了什么?

标签: c++arrayssmart-pointers

解决方案


这是由于这new std::string[5]是一个动态数组分配,因此它没有(固定/定义/可计算)大小(如果您在分配之前不保存它),事实上

auto p = new std::string[5];
std::cout << sizeof(p);

将打印8指针的大小。

因此调试器将其ptr视为一个指针,并且无法确定在第一个元素之后还有其他 4 个元素(因此无法确定这是 an array,而不仅仅是 apointer到 a string

似乎这是一个“C++ POV”,调试器可以拥有更多信息,因此应该能够弄清楚它是一个数组,string而不仅仅是一个pointer to string(感谢@Konrad Rudolph


推荐阅读