【问题标题】:VC++2010 seems to only allocate a single std::string in an fixed-arrayVC++2010 似乎只在一个固定数组中分配一个 std::string
【发布时间】:2012-10-23 16:14:07
【问题描述】:

这对我来说似乎很简单,但实际上我很难找到任何明确说明这一点的内容。

std::string stringArray[3] 是否像SomeType typeArray[3] 那样创建std::string 对象的数组?实际数量无关紧要;我随便挑了3个。

在 Visual Studio 2010 调试器中,它似乎创建了单个字符串,而不是字符串数组。为什么?

猜想:它是调用默认的std::string 构造函数,然后调用索引3 的未使用访问吗?如果是这样,为什么这不会导致空字符串出现越界异常?

这是否与重载[] 运算符有关?

有很多方法可以编写相同的代码,而无需专门使用 std::string 数组而不会出现问题,但是这种行为的解释/理由是什么?这对我来说似乎违反直觉。

编辑:我发现了这个线程 std::string Array Element Access,其中答案上的 cmets 似乎观察到相同的行为。

【问题讨论】:

  • 是什么让你相信它创建了一个字符串?
  • 因为确实如此。通过代码调试并检查输出,它是一个字符串。
  • 为什么投反对票?我准确地解释了我所观察到的。我首先研究了这个话题。我解释了我可能的解释。
  • 如果您向我们提供可能发生此行为的最少示例代码,以及它的实际输出和您期望它输出的内容,将会很有帮助。
  • 你没有解释你在观察什么(直到你刚才的评论)。您说它似乎创建了一个对象,但没有说明您为什么这么认为。由于它没有创建单个对象,因此您一定是误解了某些内容,但您没有提供足够的信息来猜测是什么。

标签: c++ arrays visual-studio-2010 stdstring declare


【解决方案1】:

Visual Studio 的调试器通常只会向您显示数组或指针指向的第一件事。您必须使用stringArray[1] stringArray[2] 等才能看得更远。

【讨论】:

  • 我敢打赌,这也是 OP 正在观察和误解的内容。您可能想提及如何在 VS 调试器中查看数组的其他元素。
  • 确实是这样。虽然我知道调试器会以这种方式运行,但我的印象是,对于声明为大小数组(而不是指针)的变量,一旦实际定义了每个索引,调试器就会以这种方式显示它,就像它一样对于我在代码中声明的不同类型的数组。不是这种情况;不知道调试器什么时候会只显示指针索引的内容,什么时候会显示数组类型。
【解决方案2】:

OP 并没有失去理智。但是 Visual Studio 的集成调试器肯定是。我相信这是为std::string 检测运算符 [] 的失败,这很可悲但是,它确实适用于std::vector<std::string>

可以在this previously posted question 找到关于如何使用监视窗口解决此问题的excellent 参考(无法使用 Auto 或 Locals 窗口 afaik 来解决此问题)。这也是查看基于指针的动态数组(使用Type *p = new Type[n]; 分配的数组)的一种非常有用的方法。提示:使用“varname,n”,其中varname 是变量(指针或固定数组),“n”是要扩展的元素数。

演示是为了显示声明的 C 数组 std::string 和 OP 正在观察的内容,以及 std::vector<std::string> 以显示事情应该是什么样子:

int main(int argc, char *argv[])
{
    std::string stringArray[3];
    std::vector<std::string> vecStrings(3);
    return 0; // set bp *here*
}

【讨论】:

  • 同意,但我认为它对于 std::vector 来说同样是脑死亡。但它适用于 POD 类型。
  • 哇,谢谢!我不知道我可以在这里发布屏幕截图,否则我会在我原来的帖子中这样做!
  • @zdan 如果你的意思是 std::vector&lt;type&gt; myArray[10]; 也是个破产者,我一点也不意外。
  • @WhozCraig 是的,这就是我的意思。
  • @taz 不要捕获整个屏幕并发布它们 =P。图形的 sn-p 越小越好,因为它与问题直接相关。让磁盘保持快乐。
【解决方案3】:

它创建一个数组。要么你编译了一些不同的东西,要么你误解了结果。

它不会在这些上下文中创建数组:

void function(std::string stringArray[3]) { }

这个函数参数是一个指向std::string的指针,你不能有数组类型的函数参数。

extern std::string strnigArray[3];

这声明但不定义一个数组。它告诉编译器在程序调用stringArray 的某处有一个由三个字符串组成的数组,但实际上并没有创建它。

否则,它会创建一个包含三个字符串的数组。

您可以通过以下方式进行检查:

assert( sizeof(stringArray) == 3*sizeof(std::string) );

或在 C++11 中

static_assert( sizeof(stringArray) == 3*sizeof(std::string), "three strings" );

【讨论】:

    【解决方案4】:

    是的,VS 2010 中的调试器在这里表现不佳,但正如其他人所说,这只是调试器中的一个显示问题,它确实可以按您的预期工作。

    在 VS 2012 中,他们做得更好:-

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 2021-09-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      相关资源
      最近更新 更多