Zac*_*eck 1 c++ templates segmentation-fault
我有一个名为Dictionary的类,其中包含一个键值对,一个指向该键值对的指针以及一个保存字典大小的int值。
template<typename K, typename V>
class 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)
};
Run Code Online (Sandbox Code Playgroud)
我正在尝试重载此类的[]运算符,当这样做时,出现段错误错误
template<typename K, typename V>
V& Dictionary<K,V>::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;
}
Run Code Online (Sandbox Code Playgroud)
我相信该行中发生段错误
array[size].value = 0;
Run Code Online (Sandbox Code Playgroud)
但是,我不知道为什么会这样。任何帮助是极大的赞赏。谢谢!
当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
Run Code Online (Sandbox Code Playgroud)
使用array[size]正在访问超出在段故障阵列和结果的末尾。
从更大的角度看,如果您需要向数组中添加元素,并且数组空间不足,则需要分配一个更大的新数组,并将元素从旧数组移动(或复制)到新数组。数组。
这是“重新分配”,并且std::vector<T>当它超出当前容量时会执行此操作。
您可能需要将动态数组的使用替换为std::vector<KeyValue>。这样就std::vector可以处理这些操作。
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |