1

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

不创建对象数组,std::string stringArray[3] 那样会吗?实际数量无关紧要;我随便挑了3个。std::stringSomeType typeArray[3]

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

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

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

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

编辑:我发现这个线程std::string Array Element Access在其中对答案的评论似乎观察到相同的行为。

4

4 回答 4

6

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

于 2012-11-03T00:31:47.627 回答
4

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

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

演示是为了显示声明的 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*
}

在此处输入图像描述

于 2012-11-03T00:38:46.293 回答
2

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

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

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" );
于 2012-11-03T00:29:33.673 回答
0

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

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

在此处输入图像描述

于 2012-11-03T10:32:40.230 回答