2

我浪费了大量时间,因为我忘记初始化迭代器然后尝试访问它们应该指向的数据。出现此类错误的唯一标记是运行时的分段错误。这是一个例子:

vector<Foo> V;
//Uninitialized pointer:
vector<Foo>::iterator it;
//....loads of code later, attempt to access pointer that points to nothing
(*it);
//Segmentation fault!

是否有一种标准技术可以在编译时自动进行这种检查?

4

3 回答 3

2

在 C++14 中,比较值初始化的迭代器是可以接受的。(2013 年 4 月通过)

所以这是真的:

vector<int>::iterator i1{};
vector<int>::iterator i2{};
assert(i1 == i2);

但这仍然无效:

vector<int>::iterator i1;
vector<int>::iterator i2;
assert(i1 == i2);

不过,我不确定哪些编译器支持这一点。

于 2014-05-05T06:15:43.247 回答
2

在编译时?不。

我可以想到几个运行时助手。首先是使用boost::optional. 第二个是设置一个标记向量,您可以使用它来初始化迭代器。

static vector<Foo> null_vector;
vector<Foo>::iterator it = null_vector.begin();
...
if (it == null_vector.begin())
于 2013-10-31T14:38:08.493 回答
1

我在实际代码中使用了一些技术。没有一个正是您正在寻找的。

首先,作为一种编程实践,我通常在靠近需要它的地方实例化一个变量,并且在我可以初始化它的时候。我从不实例化未初始化的变量。

有时不可能在一个地方实例化和初始化。在这些情况下,我将使用 Boost's 之类的东西optional,在需要使用它的地方,我会检查是否optional已设置。

我经常发现,当无法在一个地方实例化和初始化时,是因为某些函数的设计笨拙笨拙,或者它试图做的太多。尝试将这些职责分解为多个功能,您可能会发现最初的问题——无法在一个地方初始化和实例化——消失了,并且产生了更清晰的代码。

于 2013-10-31T14:41:27.820 回答