我有一个名为Dictionary的类,其中包含一个键值对,一个指向该键值对的指针以及一个保存字典大小的int值。
templateclass Dictionary { public: V& operator[](K key); private: struct KeyValue { K key; V value; }; //the key-value pair struct KeyValue* array; //pointer to an array of items (the key-value pairs) int size; //size of the dictionary (i.e. the array size) };
我正在尝试重载此类的[]运算符,当这样做时,出现段错误错误
templateV& Dictionary ::operator[](K key){ for (size_t i = 0; i < size; i++) { if (key == array[i].key) { return array[i].value; } } array[size].value = 0; size++; return array[size-1].value; }
我相信该行中发生段错误
array[size].value = 0;
但是,我不知道为什么会这样。任何帮助是极大的赞赏。谢谢!
当C和C ++中的数组具有N
元素时,有效索引为: 0, 1, 2, ... N-1
。相反,N
它不是有效的索引:它超出了数组的末尾。
在这种情况下,的最后一个元素array
是array[size - 1]
:
array[0] // first element array[1] // second element // ... array[size - 2] // second-to-last element array[size - 1] // last element array[size] // error: beyond the last element
使用array[size]
正在访问超出在段故障阵列和结果的末尾。
从更大的角度看,如果您需要向数组中添加元素,并且数组空间不足,则需要分配一个更大的新数组,并将元素从旧数组移动(或复制)到新数组。数组。
这是“重新分配”,并且std::vector
当它超出当前容量时会执行此操作。
您可能需要将动态数组的使用替换为std::vector
。这样就std::vector
可以处理这些操作。