使用 std::unique_ptr 创建对象数组
Create an array of objects using 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 个对象保留内存:
我做错了什么?
这是因为new std::string[5]
是一个动态数组分配,所以它没有(fixed/defined/calculable)大小(如果你在分配前不保存它),事实上
auto p = new std::string[5];
std::cout << sizeof(p);
将打印 8
,即指针的大小。
所以调试器将 ptr
视为一个指针,并且无法弄清楚第一个元素之后还有其他 4 个元素(因此无法弄清楚那是一个 array
,而不仅仅是 pointer
到 string
)
似乎这是一个“C++ POV”,调试器可以有更多的信息,所以应该能够弄清楚它是一个 string
的数组,而不仅仅是一个 pointer to string
(感谢@Konrad Rudolph)
我目前正在学习智能指针并正在尝试执行以下操作:
#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 个对象保留内存:
我做错了什么?
这是因为new std::string[5]
是一个动态数组分配,所以它没有(fixed/defined/calculable)大小(如果你在分配前不保存它),事实上
auto p = new std::string[5];
std::cout << sizeof(p);
将打印 8
,即指针的大小。
所以调试器将 ptr
视为一个指针,并且无法弄清楚第一个元素之后还有其他 4 个元素(因此无法弄清楚那是一个 array
,而不仅仅是 pointer
到 string
)
似乎这是一个“C++ POV”,调试器可以有更多的信息,所以应该能够弄清楚它是一个 string
的数组,而不仅仅是一个 pointer to string
(感谢@Konrad Rudolph)