这是什么样的字符串初始化?

时间:2018-01-16 17:08:31

标签: c++ c++11

刚刚遇到这个。我无法相信它会编译,但确实如此。这是什么样的字符串初始化?这是为什么呢?

std::string* name = new std::string[12];

3 个答案:

答案 0 :(得分:4)

这是一个动态的C风格的数组语法,它在std::vector被淘汰之前就已经过时了,除了这个用法的一小部分 - 并且因为C ++ 11即使最小的用法也已经消失了。

此代码动态创建并初始化12个空字符串,并将name指针设置为指向其中的第一个。现在可以使用[]运算符访问这些字符串,例如:

std::cout << name[0] << "\n";

将输出空字符串。

但是,应该永远不会有任何理由使用此构造,而是

std::vector<std::string> name(12);

应该使用。

答案 1 :(得分:4)

  

这是什么......

这是一个新表达。它在免费商店中分配一个对象。更具体地说,此表达式分配一个包含12个std::string对象的数组。

  

这是什么样的......初始化?

数组的字符串是默认初始化的。

  

为什么会这样?

这个问题的范围尚不清楚......

  • 为什么要使用数组?

因为数组是最有效的数据结构。它们会产生零空间开销,并且(取决于具体情况)与处理器缓存相互作用很好。

  • 为什么要分配动态数组(来自免费商店)?

因为必须在编译时知道自动数组的大小。直到运行时才需要知道动态数组的大小。当然,您的示例对数组使用编译时常量大小,因此不需要动态分配。

此外,因为自动变量的内存有限(在典型的桌面系统上为1到几兆字节)。因此,必须从免费商店中分配大型对象,例如包含许多对象的数组。与通常可用于自动对象的内存大小相比,12个字符串的数组并不大。

另外,因为动态对象不会在当前范围的末尾自动销毁,所以它们的生命周期比自动或静态对象更灵活。当然,这也是不使用动态对象的原因:它们不会自动销毁,并且管理它们的生命周期很困难,并且证明使用动态内存的程序的正确性可能非常困难。

  • 为什么使用新表达式来分配数组

通常没有理由这样做。标准库提供了一个RAII容器,用于处理动态分配的数组的生命周期:std::vector

答案 2 :(得分:0)

此代码分配一个包含12个std::string对象的数组,并将指针存储到name变量中数组的第一个元素。

std::string* name = new std::string[12];

new expression分配具有动态存储持续时间的12个std::string对象的数组。数组中的每个std::string对象都是通过其默认构造函数初始化的。

  

新表达式尝试分配存储,然后尝试构造和初始化单个未命名对象或已分配存储中未命名的对象数组。 new-expression返回一个指向构造对象的prvalue指针,或者,如果构造了一个对象数组,则返回指向数组初始元素的指针。

然后将指向数组初始元素的指针存储在name中,以便您可以使用[]下标运算符访问数组的元素。