C++检查未初始化的迭代器
C++ checking uninitialized iterators
我浪费了大量的时间,因为我忘记初始化迭代器,然后尝试访问它们应该指向的数据。发生此类错误的唯一标记是运行时的分段错误。下面是一个示例:
vector<Foo> V;
//Uninitialized pointer:
vector<Foo>::iterator it;
//....loads of code later, attempt to access pointer that points to nothing
(*it);
//Segmentation fault!
是否有标准技术可以在编译时自动执行此类检查?
在编译时?不。
我可以想到几个运行时助手。首先是使用boost::optional
。第二种是设置可用于初始化迭代器的哨兵向量。
static vector<Foo> null_vector;
vector<Foo>::iterator it = null_vector.begin();
...
if (it == null_vector.begin())
在 C++14 中,比较值初始化迭代器是可以接受的。(2013-04 通过)
所以这是真的:
vector<int>::iterator i1{};
vector<int>::iterator i2{};
assert(i1 == i2);
但这仍然无效:
vector<int>::iterator i1;
vector<int>::iterator i2;
assert(i1 == i2);
不过,我不确定哪些编译器支持此功能。
我在实际代码中使用了一些技术。 没有一个正是你要找的。
首先,作为一种编程实践,我通常会在需要它的位置附近实例化一个变量,并在我可以初始化它的时候实例化它。 我从不实例化未初始化的变量。
有时不可能在一个位置实例化和初始化。 在这些情况下,我将使用类似 Boost 的 optional
,在我需要使用它的地方,我将检查是否已设置optional
。
我经常发现,当无法在一个地方实例化和初始化时,那是因为某些函数的设计笨拙而笨拙,或者它试图做太多。 尝试将这些职责分解为多个函数,您可能会发现最初的问题 - 无法在一个位置初始化和实例化 - 消失并产生更干净的代码。
相关文章:
- 初始化迭代器错误 C++ 在 GCC 编译器中
- C++值初始化矢量迭代器比较
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 无法取消引用值初始化迭代器
- 制作可用于初始化向量的迭代器
- 为什么 2 个未初始化的 std::set::迭代器相等?
- 如何使用迭代器初始化地图的键字段?
- 从不同类型的容器的迭代器初始化向量
- 无法查找值初始化的向量迭代器?
- 使用迭代器对向量的C 递归初始化产生不一致的结果
- 为链接列表构建迭代器类(错误:无匹配的构造函数以初始化)
- 初始化迭代器的最佳方法是什么?
- 向量是否知道在由一对迭代器初始化时首先保留?
- 错误:无法取消引用值初始化的矢量迭代器
- C 用迭代器初始化向量
- 模板标准::映射::迭代器实例化
- std::map 迭代器初始化在C++中为零
- 将迭代器初始化为vector中的某个位置
- 如果容器未知,如何将迭代器初始化为无效内容
- 循环内部的迭代程序初始化是否被认为是糟糕的风格,以及为什么